2

以下の例のリストで何が起こっているのかを理解するのに苦労しています:

public class DataObject
{
    public List<object> SomeObjects { get; set; }
}

class Program
{
    static void Main(string[] args)
    {

        var dataObj = new DataObject()
                          {
                              SomeObjects = { new object() },
                          };

        Console.ReadKey();
    }
}

プロパティがインスタンス化されていないため、の作成はdataOjb明らかに失敗します。インスタンス化されたコンストラクターを持つことができるSomeObjectsため、コンパイルエラーはないと思います。それを考えると、次のようなことをしようとすると:DataObjectSomeObjects

List<int> SomeObjects;
SomeObjects = {1, 2, 3, 4};

これは明らかに機能しません。

List<int> SomeObjects = new List<int>();
SomeObjects = {1, 2, 3, 4};

それで、私の実際の質問にたどり着くために、最初のオブジェクト初期化子で呼び出されたものは何ですか(調べてみましたが見つかりません)、なぜそれは異なる動作をするのですか、そしてこのように使用できる他の場所はありますか?

4

1 に答える 1

7

私の実際の質問にたどり着くには、最初のオブジェクト初期化子で呼び出されるものは何ですか

これは同等のコードです:

var tmp = new DataObject();
tmp.SomeObjects.Add(new object());
var dataObj = tmp;

(そしてtmp.SomeObjects、明らかに、あなたの場合はnullであるため、2行目は失敗します。)

この= { ... }構文は、オブジェクト初期化子内でのみ適用できます。これが、後者の 2 つのコード スニペットが無効である理由です。

より具体的には、仕様用語では、メンバー初期化子の形式は次のとおりです。

identifier = initializer-value

ここで、initializer-valueexpressionまたはobject-or-collection-initializer のいずれかです。ただし、これはコレクションだけに適用されるわけではありません...既存のメンバーのプロパティも設定できます。

var foo = new Foo {
    Bar = {
        X = 2,
        Y = 3
    }
};

これは次と同等です:

var tmp = new Foo();
tmp.Bar.X = 2;
tmp.Bar.Y = 3;
var foo = tmp;
于 2013-01-04T14:19:33.927 に答える