◆ オブジェクト初期化子で prop = { }
◆ リストのアイテムやプロパティを設定できる
◆ new しないのですでにあるものに追加することになる 

ネットでみかけたコードで
Children = { item1, item2 }

という感じのものがありました

 = のあとにいきなり { } があります

new の書き忘れかなー と思ったのですが 試してみるとそういう書き方ができました

Object Initializer

使えるのは通常の代入文ではなくて 初期化子の中だけです
public class A
{
    public List<int> list { get; set; } = new List<int>();
}

var a = new A
{
    list = { 1 }
};

こういう使い方です
このコードでは普通に動きます


こんなことはできませんでした
var a2 = new A();
a2.list = { 1 }; //  error


初期化子でも普通は
var a = new A
{
    list = new List<int>
    {
        1
    };
};

と書くのしか知らなかったので やっぱり初めて見る省略形式です


いろいろ試してみると 正確には省略ではなくて違う動きでした
この書き方では新規にインスタンスを作ってるわけではないです

すでにあるものに追加しています

そのため こういう list の初期値が null の場合は
public class B
{
    public List<int> list { get; set; }
}

var b = new B
{
    list = { 1 }
};

オブジェクト参照がオブジェクト インスタンスに設定されていません。

と実行時にエラーになります


コンストラクタでリストにすでに何かが入っていればその後に追加されます
public class C
{
    public List<int> list { get; set; } = new List<int> { 1, 2 };
}

var c1 = new C
{
    list = new List<int> { 3 }
};
// C { list=List<int>(1) { 3 } }

var c2 = new C
{
    list = { 3 }
};
// C { list=List<int>(3) { 1, 2, 3 } }

プロパティでも一緒

リストだけでなく通常のプロパティでも同じです

プロパティが null だとエラーです
private class Inner {
    public string s { get; set; }
}
private class Outer {
    public Inner i { get; set; }
}

var o = new Outer {
    i = {
        s = "abc"
    }
};

オブジェクト参照がオブジェクト インスタンスに設定されていません。


プロパティが設定されていればそのプロパティのプロパティを書き換えます
private class Inner {
    public string s { get; set; }
}
private class Outer {
    public Inner i { get; set; } = new Inner();
}

var o = new Outer {
    i = {
        s = "abc"
    }
};
// Outer { i=Inner { s="abc" } }

new で新規に作るのと違い指定されたプロパティだけを上書きします
private class Inner
{
    public string s { get; set; }
    public double d { get; set; }
}
private class Outer
{
    public Inner i { get; set; }
    public Outer(string s)
    {
        this.i = new Inner();
        this.i.s = s;
    }
}

var o1 = new Outer("abc")
{
    i = {
        d = 1.23
    }
};
// Outer { i=Inner { d=1.23, s="abc" } }

var o2 = new Outer("abc")
{
    i = new Inner
    {
        d = 1.23
    }
};
// Outer { i=Inner { d=1.23, s=null } }

空だとエラーにならない

特殊なパターンがひとつあります
private class Inner
{
    public string s { get; set; }
}
private class Outer
{
    public Inner i { get; set; }
}

var o = new Outer
{
    i = {
        s = { }
    }
};

o.i // null

Outer.i が null なので "i = { s = {} }" がエラーになりそうですがエラーは起きません


prop = { } という書き方は中身があれば代入するという処理をしているわけなので 何もなければ何もしないからなんだと思います

たぶんですが IL では
var o = new Outer
{
    i = {
        s = "abc"
    }
}
var o = new Outer();
o.i.s = "abc"

と同じものになっていて s = {} だと 2 行目部分がないのでしょう


これまで使ったことない書き方でしたが けっこう便利そうです