6

Dictionary<string,bool> であるプロパティを持つクラスがあるとします。オブジェクト初期化子を使用して、この構文を使用できます (かなりきれいに見えると思います)。

new MyClass()
{
  Table = { {"test",true},{"test",false} }
}

ただし、イニシャライザの外では、これを行うことはできません:

this.Table = { {"test",true},{"test",false} };

なぜイニシャライザは特殊なケースなのですか? LINQの要件、共分散などと関係があると推測するのは危険ですが、そのような初期化子をどこでも使用できないのは少し違和感があります...

4

3 に答える 3

11

質問はLINQとは何の関係もなく、一般的な分散とは何の関係もなく、コレクション初期化子とオブジェクト初期化子を備えているため、質問はやや混乱しています。本当の問題は、私が知る限り、「オブジェクト作成式の外でコレクション初期化子を使用することがなぜ合法ではないのか?」ということです。

ここでの関連する設計原則は、一般に、オブジェクトを作成および初期化する操作では、ここでオブジェクトの作成が行われていることを読者に知らせるために、どこかに "new" という単語を含める必要があるということです。(はい、C# のこの規則にはいくつかの例外があります。読者の演習として、それらすべてに名前を付けることができるかどうかを確認してください。)

自分のやり方で物事を行うと、コードについての推論が難しくなります。クイック、これは何をしますか?

d = new List<int>() { 10, 20, 30 };
d = { 40, 50, 60 };

2 行目は既存のリストに 40、50、60 を追加しますか? それとも、古いリストを新しいものに置き換えますか? そこには「新しい」というものがないので、読者は新しいオブジェクトが作成されたと期待していますか?

あなたが言う時

q = new Whatever() { MyList = { 40, 50, 60 } };

新しいリストを作成しません。コンストラクターによって割り当てられた既存のリストに 40、50、60 を追加します。したがって、提案された構文は、新しいリストが作成されるかどうかに関してあいまいで混乱します。

提案された機能は紛らわしく、不必要であるため、すぐに実装される可能性は低い.

于 2011-01-23T16:38:36.527 に答える
2

この制限は、LINQ よりもはるかに古いものです。Cに戻っても、書くことができます

int numbers[5] = {1, 2, 3, 4, 5};

しかし、この構文を使用して配列に値を代入することはできませんでした。

C# でのこの背後にある理由についての私の推測では、通常、2 つの異なるオブジェクトに対して同じ参照を使用するべきではないということです。新しいコレクションを既存の参照に割り当てる必要がある場合、ほとんどの場合、コードをうまく設計していません。定義時にコレクションを初期化するか、1 つではなく 2 つの別々の参照を使用することができます。

于 2011-01-23T13:00:32.183 に答える
0

実行時に構文がスローされることを考慮すると、NullReferenceExceptionそれを使用できると確信していますか?

public class Test
{
  public Dictionary<string, bool> Table {get; set;}
}

public void TestMethod()
{
  Test t = new Test { Table = { {"test", false} } }; //NullReferenceException
}

これは次のようにコンパイルされます (リフレクター経由):

Test <>g__initLocal3 = new Test();
<>g__initLocal3.Table.Add("test", 0.0M);

ご覧のとおり、は初期化されていないため、実行時Tableに が生成されます。NullReferenceException

の ctor で Dictionary を作成するとTest、クラス初期化子はステートメントのカスケードを生成します。これは、初期化子 ( s の場合) のAdd構文糖衣です。IEnumerable

これはおそらく、私たちが見ることも想像することもできない予期せぬ副作用のため、通常のコードには導入されませんでした。エリック・リッパートは、当面の問題についてより多くの洞察を持っている可能性があるため、手助けできるかもしれません。

于 2011-01-23T12:56:59.443 に答える