这个问题是Cristi Diaconescuthis
关于在 C# 中访问字段初始值设定项的非法性的扩展。
这在 C# 中是非法的:
class C
{
int i = 5;
double[] dd = new double[i]; //Compiler error: A field initializer cannot reference the non-static field, method, or property.
}
好的,Eric Lippert等人给出了为什么这是非法的合理解释:
简而言之,在构造函数体运行之前访问接收器的能力是边际收益的一个特征,它使得编写有缺陷的程序变得更容易。因此,C# 语言设计者完全禁用了它。如果您需要使用接收器,则将该逻辑放入构造函数主体中。
此外,C# 规范非常简单(在一定程度上):
实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始化器中引用 this 是编译时错误,因为变量初始化器通过 simple-name引用任何实例成员是编译时错误。
所以我的问题是:“通过一个简单的名字”是什么意思?
是否有其他合法的替代机制?我确信规范中的几乎每个单词都有一个非常具体的原因,那么将这个特定代码的非法性限制为通过简单名称进行引用的原因是什么?
编辑:我的问题措辞不够好。我不是在询问“简单名称”的定义,而是询问将非法性限制在特定场景的原因。如果以任何方式引用任何实例成员总是非法的,那么为什么要如此狭隘地指定它呢?如果不是,那么什么机制是合法的?