2010-11-18 37 views
0

あなたはタイプTの空のIEnumerableを作成したい場合は、あなたがIEnumerable.Empty <T>()で、IEnumerableでないのはなぜですか?<T> .Empty()?

Enumerable.Empty<T>() 

静的ジェネリックメソッドを使用して作成することができますが詳細はhereを参照してください。

ジェネリック型(非ジェネリック型の汎用静的メソッドではなく)に対して静的メソッドを使用する代わりに、Microsoftがこのオプションを選択したのはなぜですか?

このメソッドは、このように使用することができます:

Enumerable<T>.Empty() 

IEnumerable<T>を返すことになります。

私の意見では、2番目の選択肢は、IEnumerable<T>の汎用品であり、非汎用品ではないIEnumerableではありません。

編集:タイプミス

+0

それは 'Enumerable.Empty は' 'IEnumerable.Empty ' – spender

+0

はFYIあなたがいないIEnumerable.Empty Enumerable.Empty を意味し、あなたは、インターフェイスに静的を持つことができないではないです。 –

+0

私は自分の質問を投稿するとすぐに、理由は明らかにインターフェイス上で静的メソッドを持つことができないことに気づいた..また、Enumerable は存在しません。 – GuiSim

答えて

12

IEnumerable<T>はインターフェースです。
インターフェイスに静的メンバーを含めることはできません。

静的方法は、非ジェネリックstaticクラスであるEnumerableタイプに実際にあります。
したがって、メソッドを含むことができる汎用クラスのEnumerable<T>はありません。

Static members on generic types should be avoided
拡張メソッドは、を汎用タイプに配置できません。
これは、静的なEnumerableクラスが一般的でない理由です。

+0

なぜこれを控除したのですか? – SLaks

+0

msdnページを読むと、ジェネリック型の静的メンバーがなぜ悪いのか分かりません。 – GuiSim

+0

@Gui:彼らは悪ではありません。彼らはちょうど混乱しています。 – SLaks

3

このメソッドが定義されているEnumerableという静的クラスがあります。 Enumerable<T>という静的クラスはありません。これは、EnumerableIEnumerable<T>の拡張メソッドを定義している(そのようなメソッドはすべて汎用パラメータTです)、拡張メソッドは汎用クラスには存在しないためです。そのため、Empty<T>がそのように定義されています。

仕様の§10.6.9から:

拡張メソッドは、唯一の非ジェネリック、非ネストされた静的クラスで宣言することができます。

関連する問題