2010-11-18 140 views
0

如果你想创建一个空的IEnumerable T类型的,你可以使用静态泛型方法为什么它IEnumerable.Empty <T>()而不是IEnumerable <T> .Empty()?

Enumerable.Empty<T>() 

更多信息,请参见here创建它。

为什么微软会选择这个选项,而不是在泛型类型上使用静态方法(与非泛型类型上的泛型静态方法相反)?

该方法可用于这样的:

Enumerable<T>.Empty() 

这将然后返回一个空IEnumerable<T>

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

编辑:错字

+0

这是'Enumerable.Empty ''不IEnumerable.Empty ' – spender 2010-11-18 16:47:43

+0

仅供参考你的意思Enumerable.Empty 不IEnumerable.Empty ,你不能有一个接口上的静态。 – 2010-11-18 16:48:03

+0

是的,只要我发布我的问题,我意识到,原因是因为你显然不能有一个接口上的静态方法..此外,Enumerable 不存在。 – GuiSim 2010-11-18 16:56:50

回答

12

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

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

Static members on generic types should be avoided
扩展方法不能将置于通用类型中。
这就是为什么静态Enumerable类不是通用的。

+0

为什么这会降低投票率? – SLaks 2010-11-18 17:01:51

+0

阅读msdn页面,我不知道为什么静态成员泛型类型是邪恶的。 – GuiSim 2010-11-18 18:30:35

+0

@Gui:他们不是邪恶的;他们只是混淆。 – SLaks 2010-11-18 18:37:43

3

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

从规范的§10.6.9:

扩展方法只能在非泛型,非嵌套静态类中声明。

相关问题