rksoftware

Visual Studio とか C# とかが好きです

C# 11 の新機能を確認「 auto-default 構造体」

C# 11 の新機能を確認しています。目次は次の記事です。
rksoftware.hatenablog.com

今回は 「 auto-default 構造体 」。公式 Learn の記事は次です。

learn.microsoft.com

C# 11 以降では、構造体に初期化されていないフィールドがある場合、~ 」 から始まる部分です。
構造体のコンストラクタで初期化されないフィールド、プロパティが自動で default で初期化されるようになりました。

■ 確認

次のようなコードが書けます。

struct Saitama
{
    string Omiya;
    string Kawagoe { get; set; }
    public Saitama() { }
}

ちなみにこのコードは .NET 6 を指定した場合は次のエラーになります。

エラー CS0171 コントロールを呼び出し元に返す前に、フィールド 'Saimata.Omiya' を完全に割り当てる必要があります。プロパティを自動既定値にするため '11.0' 言語バージョンに更新することを検討してください。
エラー CS0843 コントロールを呼び出し元に返す前に、自動実装プロパティ 'Saimata.Kawagoe' を完全に割り当てる必要があります。プロパティを自動既定値にするため '11.0' 言語バージョンに更新することを検討してください。

.NET 6 の頃はこんな感じに書く必要がありました。

struct Saitama
{
    string Omiya;
    string Kawagoe { get; set; }
    public Saitama() =>(Omiya, Kawagoe) = ("最高", "最高");
}

■ コンストラクタ内で参照

この機能によって、コンストラクタで値をセットする前に参照することも許されるようになるようです。次のコードはエラーにならず実行できます。

new Saitama();

struct Saitama
{
    string Omiya;
    string Kawagoe { get; set; }
    public Saitama()
    {
        Console.WriteLine(Omiya);
        (Omiya, Kawagoe) = ("最高", "最高");
    }
}

ちなみにこのコードは .NET 6 を指定した場合は次のエラーになります。

エラー CS9015 割り当てられていない可能性のあるフィールド 'Omiya' を使用しています。フィールドを自動既定値にするため '11.0' 言語バージョンに更新することを検討してください。

■ 覚えておきましょう

この機能は覚えておかないと、どこかで不要な初期化コードを書いてすこし恥ずかしい気持ちになるかもしれません。覚えておきましょう。