C#6 引入了在没有 setter 的情况下初始化属性的能力,因此现在可以使用这种语法
public class MyClass
{
public int Answer { get; } = 42;
}
甚至这个
public class MyClass
{
public int Answer { get; }
public MyClass()
{
Answer = 42;
}
}
我知道(或者更确切地说,强烈假设)这将被翻译成使用readonly
CIL 中的访问器方法生成的字段,所以我理解这是如何
public class MyClass
{
public int Answer { get; }
public MyClass CreateMyClassInstance()
{
return new MyClass()
{
Answer = 42
};
}
}
不编译(因为从技术上讲,赋值发生在构造函数之外,这与支持readonly
字段施加的限制相冲突)。
我的问题是为什么首先禁止这种行为?为什么,从句法和/或编译的角度来看,作为对象初始化程序一部分的属性分配不仅被视为要在之后执行的额外内联逻辑,而且仍然在对象的构造函数中?是设计使然,还是技术限制或向后兼容性的结果,或者只是一个不够重要而无法考虑的变化?