在构造函数本地函数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#中设置只读字段的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数调用中设置一个短值[重复]

PHP ORM如何在构造函数中设置id

JSON.net,C#,无法在数据模型中设置默认值

在类构造函数中设置 std::vector

在“原型”中设置“构造函数”属性的好处

如何在构造函数中设置 GUI 不可见?