8

この質問に対する答えが見つかりませんでした。それは明らかなはずですが、それでもです。

この単純化された例では、初期化子を使用しようとしています:

    MyNode newNode = new MyNode 
    {
        NodeName = "newNode",
        Children.Add(/*smth*/) // mistake is here
    };

Children は、リストを返すこのクラスのプロパティです。そしてここで、「無効な初期化子メンバー宣言子」のような間違いに遭遇しました。

ここで何が問題なのですか?また、そのようなプロパティをどのように初期化しますか? よろしくお願いします!

4

6 に答える 6

23

オブジェクト初期化子でそのようなメソッドを呼び出すことはできません。メソッドを呼び出すのではなく、プロパティまたはフィールドを設定することしかできません。ただし、この場合、おそらくオブジェクトとコレクションの初期化構文を使用できます。

MyNode newNode = new MyNode
{
    NodeName = "newNode",
    Children = { /* values */ }
};

これは に新しい値を割り当てようとしないことに注意してください。次のようChildrenに を呼び出します。Children.Add(...)

var tmp = new MyNode();
tmp.NodeName = "newNode":
tmp.Children.Add(value1);
tmp.Children.Add(value2);
...
MyNode newNode = tmp;
于 2011-06-17T12:38:33.733 に答える
4

これは、children プロパティが初期化されていないためです。

MyNode newNode = new MyNode 
    {
        NodeName = "newNode",
        Children = new List<T> (/*smth*/)
    };
于 2011-06-17T12:38:11.410 に答える
2

値を代入するのではなく、メソッドを実行しているため

于 2011-06-17T12:37:36.967 に答える
2

フィールド初期化構文は、メソッドの呼び出しではなく、フィールドとプロパティの設定にのみ使用できます。Childrenisの場合List<T>、リスト初期化構文も含めることで、この方法で実現できる可能性があります。

T myT = /* smth */

MyNode newNode = new MyNode 
{
    NodeName = "newNode",
    Children = new List<T> { myT }
};
于 2011-06-17T12:37:39.427 に答える
2

以下は、イニシャライザに値を設定していません。

Children.Add(/*smth*/) // mistake is here

フィールドのメンバー (まだ初期化されていないものも) にアクセスしようとしています。

于 2011-06-17T12:38:08.680 に答える
2

初期化子はプロパティを初期化するだけで、他のアクションではありません。

Children リストを初期化しようとしているのではなく、何かを追加しようとしています。

Children = new List<smth>()初期化中です。

于 2011-06-17T12:38:58.400 に答える