3

次の点を考慮してください。

public class Foo
{
    public List<int> ListProp { get; set; } = new List<int>();
    public int[] ArrayProp { get; set; } = new int[3];
}

public static void Main()
{
    new Foo
    {
        // This works, but does not call the setter for ListProp.
        ListProp = { 1, 2, 3 },

        // This gives a compiler error: 'int[]' does not contain a
        // definition for 'Add' and no extension method 'Add' accepting
        // a first argument of type 'int[]' could be found (are you
        // missing a using directive or an assembly reference?)
        ArrayProp = { 4, 5, 6 }
    };
}

何が起こっているのか理解したいと思っています。ListProp セッターは呼び出されません。また、ArrayProp を割り当てようとするコンパイラ エラーは、内部的に、この割り当てが "Add" メソッドを呼び出そうとしていることを示唆しています。

PS: 明らかに、このようにコードを動作させることができます:ArrayProp = new int[] { 4, 5, 6 }しかし、それは私の好奇心を満足させません :)

4

1 に答える 1

1

ListProp セッターが呼び出されない

実際に再設定されていないからです。この場合、コレクション初期化構文のシュガーが実際に呼び出さList<T>.Addれます。それは基本的にやっています:

public static void Main()
{
    Foo expr_05 = new Foo();
    expr_05.ListProp.Add(1);
    expr_05.ListProp.Add(2);
    expr_05.ListProp.Add(3);
}

また、ArrayProp を割り当てようとするコンパイラ エラーは、内部的に、この割り当てが "Add" メソッドを呼び出そうとしていることを示唆しています。

そうです、前述のように、コレクション初期化子はAdd、指定されたコレクションでメソッドを呼び出すための構文糖衣にすぎません。、int[]またはその配列にはAddメソッドがないため、コンパイル時にエラーが発生します。

于 2016-02-07T16:38:21.910 に答える