编译器将SetI
本地函数转换为单独的类级方法。由于这个单独的类级方法不是构造函数,因此您不能将其分配给只读字段。
所以编译器接受这个:
public class A
{
private readonly int i;
public A()
{
void SetI()
{
i = 10;
}
SetI();
}
}
并将其变成这样:
public class A
{
private readonly int i;
public A()
{
<.ctor>g__SetI|1_0();
}
[CompilerGenerated]
private void <.ctor>g__SetI|1_0()
{
i = 10;
}
}
(SharpLab。我放弃了,readonly
所以它会编译。)
如您所见,它正在尝试从不是构造函数i
的方法进行分配。<.ctor>g__SetI|1_0()
不幸的是,C# 7.0 语言规范还没有发布,所以我不能引用它。
如果您尝试使用委托,则会发生完全相同的情况:
public class A
{
private readonly int i;
public A()
{
Action setI = () => i = 10;
setI();
}
}
编译为:
public class A
{
private readonly int i;
public A()
{
Action action = <.ctor>b__1_0;
action();
}
[CompilerGenerated]
private void <.ctor>b__1_0()
{
i = 10;
}
}
(SharpLab,再次没有readonly
。)
...同样无法编译。