在构造函数局部函数 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。)

...同样无法编译。