为什么IEnumerable.Empty <t>()而不是IEnumerable <t> .Empty()?</t> </t>

时间:2010-11-18 16:45:03

标签: c# methods static types generics

如果要创建类型为T的空IEnumerable,可以使用静态泛型方法创建它

Enumerable.Empty<T>()

有关详细信息,请参阅here

为什么Microsoft选择此选项而不是在泛型类型上使用静态方法(而不是非泛型类型的通用静态方法)?

这种方法可以像这样使用:

Enumerable<T>.Empty()

然后返回一个空的IEnumerable<T>

在我看来,第二个选项更有意义,因为我想要创建的是通用的IEnumerable<T>,而不是非通用的IEnumerable

编辑:拼写错误

2 个答案:

答案 0 :(得分:12)

IEnumerable<T>是一个界面 接口不能包含静态成员。

静态方法实际上位于 Enumerable 类型,这是一个非通用static类。
因此,没有Enumerable<T>泛型类可以包含该方法。

Static members on generic types should be avoided
扩展方法不能放置在泛型类型中 这就是静态Enumerable类不是通用的原因。

答案 1 :(得分:3)

有一个名为Enumerable的静态类,定义了此方法。没有名为Enumerable<T>的静态类。这是因为EnumerableIEnumerable<T>上定义了扩展方法(所有这些方法都有一个通用参数T),并且扩展方法不能存在于泛型类中。这就是Empty<T>被定义为原因的原因。

来自规范的§10.6.9:

  

扩展方法只能在非通用的非嵌套静态类中声明。