基本的に非活性インターフェイスが.NET 1.0および1.1で最初に登場しました。その後、.NET 2.0が出てきたとき、それに相当するものが出てきました。あなたは基本的にの両方を実装するを持っている、と明示的なインターフェイスを使用する必要があります - 人生はジェネリックが実装面では、.NET 1.0 :)
に代わり、両方の「のみ」IEnumerable<T>
それを作った場合にはずっと簡単だっただろう両方ともパラメータなしのGetEnumerator
メソッドを定義すると、実装も同じです。一方
public IEnumerator<T> GetEnumerator()
{
// Return real iterator
}
// Explicit implementation of nongeneric interface
IEnumerator IEnumerable.GetEnumerator()
{
// Delegate to the generic implementation
return GetEnumerator();
}
、あなたはめったに幸い、手によって完全にこれらのものを実装する必要がありません(yield return
などで)C#2で導入されたイテレータブロックと:IEnumerator<T>
はあまりにもIEnumerator
を拡張するとして、それは通常、このようなものです。上記のような記述が必要な場合は、GetEnumerator
メソッドでyield return
を使用する必要があります。 IList<T>
がないがIList
を拡張しない、とICollection<T>
はICollection
を延長しないことを
は注意してください。これは型の安全性が劣るからです...一般的なイテレータは、任意の値のobject
,IList
およびICollection
への変換(潜在的にボクシング)のために、非永続的なイテレータとして見なすことができますが、をにコレクション; IList<int>
に文字列を追加することは意味がありません。
編集:私たちがIEnumerable<T>
を必要とする理由は、タイプセーフな方法で反復し、その情報を伝播できるようにするためです。 IEnumerable<string>
を返すと、返されたすべての文字列が文字列リファレンスまたはnullであると見なすことができます。 IEnumerable
の場合、Current
プロパティがIEnumerator
の場合はobject
なので、シーケンスから返された各要素を効果的にキャストする必要があります(foreach
ステートメントに暗黙的に記述する必要があります)。なぜ我々はまだIEnumerable
を必要とする - 古いインターフェイスは決して遠く離れて行くことがないため。それを使用している既存のコードが多すぎます。
それはIEnumerable
を拡張しないIEnumerable<T>
可能だっただろうが、その後IEnumerable<T>
を利用することを希望する任意のコードがIEnumerable
を受け入れるメソッドを呼び出すことができませんでした - と.NET 1.1からそのようなメソッドの多くがありました1.0。
ジェネリックスが.NET 1.0にそれを作ったなら、人生はもっと簡単になったはずです... – Oded
@Jon:質問は:なぜIEnumerable 'を既に実装している場合でも' IEnumerable'を実装する必要がありますか? 、またはその逆? –
Nawaz
@Nawaz:答えを編集しました。なぜジェネリック医薬品が良いのかという考えをあなたはどれくらい快適に感じていますか? –