Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 :

  • order of initialization in inheritance scenario could be very confusing,

  • implementing such a feature would require some resources from the compiler development team for little benefit,

  • it's not possible to use method or properties for logical reasons (thanks Peter), so for consistency the same is true for fields.

like image 932
Pragmateek Avatar asked Nov 26 '10 14:11

Pragmateek


2 Answers

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)
    }
}
like image 70
Peter Avatar answered Sep 21 '22 05:09

Peter


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.

like image 30
Dirk Vollmar Avatar answered Sep 21 '22 05:09

Dirk Vollmar