[英]Set readonly fields in a constructor local function 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
所以它會編譯。)
正如您所看到的,它正在嘗試從方法<.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
。)
...同樣無法編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.