在构造函数本地函数c#中设置只读字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在构造函数本地函数c#中设置只读字段相关的知识,希望对你有一定的参考价值。
以下内容无法编译。
public class A
{
private readonly int i;
public A()
{
void SetI()
{
i = 10;
}
SetI();
}
}
它失败并出现此错误:
CS0191无法分配只读字段(构造函数或变量初始化程序除外)
从技术上讲,我们还没有在构造函数中,因为本地函数的可见性是有限的,所以我想知道为什么这不编译。
答案
编译器将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
。)
...同样无法编译。
以上是关于在构造函数本地函数c#中设置只读字段的主要内容,如果未能解决你的问题,请参考以下文章