![](/img/trans.png)
[英]error CS0236: A field initializer cannot reference the non-static field, method, or property
[英]Conceptual reason of the 'A field initializer cannot reference the non-static field, method, or property' CS0236 Error
C#不允许实例字段初始值设定项引用另一个字段。 例如,此代码无效:
class A
{
string s1 = "";
string s2 = s1;
}
因为“s2”引用“s1”。
但为什么不允许这样做呢?
我的第一个想法是C#规范不保证任何初始化顺序,但根据规范,顺序是声明的顺序:
变量初始值设定项以它们出现在类声明中的文本顺序执行。
因此,如果订单是确定性的,那么这类代码的缺陷可能是什么?
在此先感谢您的帮助。
编辑:
根据Hps , 0xA3和Peter的答案:
继承方案中的初始化顺序可能非常混乱,
实现这样的功能需要编译器开发团队的一些资源,但收效甚微,
由于逻辑原因,不可能使用方法或属性(感谢Peter ),因此为了保持一致性,字段也是如此。
我不确定某个字段,但拒绝字段初始化程序访问属性或方法似乎是合理的。 例如:
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)
}
}
编译器可能可以检查字段的顺序,然后在先前声明了其他字段的情况下允许初始化。
除了重新排序或重新构造的缺陷会破坏代码之外,为什么编译器应该是不必要的复杂。 资源有限,编译器团队可能更喜欢处理具有更高优先级的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.