2

多くの人が私に理由を尋ねますが、私は彼らに対して良い答えを持っていません.

明らかに正当な理由があります。誰もそれを知っていますか?

ここで検索したところ、この質問が見つかりました。それがどのように機能するかを説明しますが、理由は説明しません。

4

2 に答える 2

11

と同等のものが必要でしたIEnumerable<int>が、C#1.0を使用していたとします。実装することもできIEnumerableますが、その場合は、反復ごとにボックス化とボックス化解除が必要になります。あなたの一種のダックタイピングバージョンを使用するとforeach、ボクシングなしで逃げることができます。多くの場合、ボクシングは実際にはそれほど有害ではありませんが(パフォーマンスのヒットが誇張されていることに気付く傾向があります)、それでもエレガントではありません。

ジェネリックスがC#1.0にあったとしたら、に制限されていたのではないかと強く思います。foreachIEnumerable<T>

于 2008-12-25T20:49:44.897 に答える
1

ダック型の foreach と IEnumerable には、さらにいくつかの利点があります。

  1. 「foreach」で使用できるように「IEnumerable」契約を十分に満たしているものの、契約を完全には満たしていないもの、特に独立した列挙子を繰り返し取得する機能がいくつかあります。この点に関しては、IEnumerator [ジェネリックかどうか] または IEnumerable [同様に] のいずれかを受け入れるように "foreach" を割り当てることは、別の解決策になります。
  2. IEnumerable.GetEnumerator の一部の実装は IEnumerator を実装する構造体を返しますが、これはダック タイピングを使用する場合に便利ですが、一部のコンテキストでは動作が問題になる可能性があります。foreach がダック タイピングを使用するという事実により、コンパイラは public GetEnumerator() 関数に構造体型の列挙子 (インターフェイスを実装しない) を返させ、IEnumerable.GetEnumerator にクラスを返させながら、コンパイラにそれを使用させることができます。

2 番目の利点は、実際にはダックタイピングによってのみ達成できます。

于 2011-11-15T17:45:13.077 に答える