次のような自動プロパティを使用して C# で構造体を定義するとします。
public struct Address
{
public Address(string line1, string line2, string city, string state, string zip)
{
Line1 = line1;
Line2 = line2;
City = city;
State = state;
Zip = zip;
}
public string Line1 { get; protected set; }
public string Line2 { get; protected set; }
public string City { get; protected set; }
public string State { get; protected set; }
public string Zip { get; protected set; }
}
ファイルをビルドしようとすると、コンパイル エラーが発生しますThe 'this' object cannot be used before all of its fields are assigned to
。これは、コンストラクターを変更して、次のようにデフォルトのコンストラクターへの連鎖呼び出しを行うことで解決できます。
public Address(string line1, string line2, string city, string state, string zip): this()
{
Line1 = line1;
Line2 = line2;
City = city;
State = state;
Zip = zip;
}
私の質問は、なぜこれが機能するのか、何が起こっているのかということです。私は推測を持っており、IL を見てそれを証明しようとしましたが、IL を分解できると思うかどうかは冗談です。しかし、自動プロパティは、コンパイラが舞台裏でプロパティのフィールドを生成することで機能すると思います。これらのフィールドにはコードからアクセスすることはできません。すべての設定と取得は、プロパティを通じて行う必要があります。構造体を作成するとき、既定のコンストラクターを明示的に定義することはできません。そのため、舞台裏では、開発者が見ることができないフィールドの値を設定するデフォルトのコンストラクターをコンパイラーが生成している必要があります。
すべての IL ウィザードは、私の理論を証明または反証することを歓迎します。