Pragmateek
Pragmateek

Reputation: 13374

Conceptual reason of the 'A field initializer cannot reference the non-static field, method, or property' CS0236 Error

C# does not allow an instance field initializer to reference another field. For instance this code is not valid :

class A
{
 string s1 = "";
 string s2 = s1;
}

because "s2" references "s1".

But why this is not permitted ?

My first thought was that the C# specs do not guarantee any initialization order but according to the specs the order is the order of declaration :

The variable initializers are executed in the textual order in which they appear in the class declaration.

So if the order is deterministic what could be the pitfalls of this kind of code ?

Thanks in advance for your help.

EDIT :

According to the answers of Hps, 0xA3 and Peter :

Upvotes: 6

Views: 834

Answers (2)

Peter
Peter

Reputation: 14108

I'm not sure about a field, but it seems rational to deny field initializers access to properties or methods. For example:

class A
{
    string s1 = GetString();
    string s2 = this.MyString;
    string s3 = "test";

    public string GetString()
    {
        // this method could use resources that haven't been initialized yet
    }

    public string MyString
    {
        get { return s3; } 
        // this field hasn't been initialized yet 
        // (okay, strings have a default value, but you get the picture)
    }
}

Upvotes: 5

Dirk Vollmar
Dirk Vollmar

Reputation: 176169

The compiler probably could check the order of the fields and then allow initialization if the other field has been previously declared.

Besides the pitfall that re-ordering or re-structuring breaks your code, why should the compiler be unnecessarily complex. Resources are limited, and the compiler team probably prefers working on features with higher priority.

Upvotes: 2

Related Questions