在构造函数局部函数 c# 中设置只读字段
Set readonly fields in a constructor local function c#
以下不编译。
public class A
{
private readonly int i;
public A()
{
void SetI()
{
i = 10;
}
SetI();
}
}
失败并出现此错误:
CS0191 A readonly field cannot be assigned to (except in a constructor or a variable initializer)
从技术上讲,我们仍然不在构造函数中,因为局部函数的可见性是有限的,所以我想知道为什么它不能编译。
编译器将 SetI
局部函数转换为单独的 class 级方法。由于这个单独的 class 级方法不是构造函数,因此您不能从中分配给只读字段。
所以编译器采用这个:
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
所以它会编译。)
如您所见,它试图从方法 <.ctor>g__SetI|1_0()
中分配 i
,这不是构造函数。
很遗憾,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
。)
...同样无法编译。
以下不编译。
public class A
{
private readonly int i;
public A()
{
void SetI()
{
i = 10;
}
SetI();
}
}
失败并出现此错误:
CS0191 A readonly field cannot be assigned to (except in a constructor or a variable initializer)
从技术上讲,我们仍然不在构造函数中,因为局部函数的可见性是有限的,所以我想知道为什么它不能编译。
编译器将 SetI
局部函数转换为单独的 class 级方法。由于这个单独的 class 级方法不是构造函数,因此您不能从中分配给只读字段。
所以编译器采用这个:
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
所以它会编译。)
如您所见,它试图从方法 <.ctor>g__SetI|1_0()
中分配 i
,这不是构造函数。
很遗憾,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
。)
...同样无法编译。