簡體   English   中英

在構造函數本地函數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無法分配只讀字段(構造函數或變量初始化程序除外)

從技術上講,我們還沒有在構造函數中,因為本地函數的可見性是有限的,所以我想知道為什么這不編譯。

編譯器將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM