在构造函数局部函数C#中设置只读字段

时间:2019-03-15 11:29:47

标签: c# constructor compiler-errors readonly local-functions

以下内容无法编译。

public class A
{
    private readonly int i;

    public A()
    {
        void SetI()
        {
            i = 10; 
        }

        SetI();
    }
}

由于以下错误而失败:

  

CS0191无法分配只读字段(在构造函数或变量初始化程序中除外)

从技术上讲,我们仍然不在构造函数中,因为局部函数的可见性受到限制,所以我想知道为什么它不能编译。

1 个答案:

答案 0 :(得分:21)

编译器将utf8_general_ci局部函数转换为单独的类级方法。由于此单独的类级方法不是构造函数,因此不允许您从中分配只读字段。

因此,编译器采用以下方法:

iconv("ISO-8859-1", "UTF-8", $city);

并将其转换为:

<html lang="tr-TR"> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" />

({SharpLab。我放弃了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; } }

很遗憾,尚未发布C#7.0语言规范,所以我无法引用它。

如果您尝试使用委托,则完全相同:

readonly

被编译为:

i

({SharpLab,同样没有<.ctor>g__SetI|1_0()。)

...同样无法编译。