【问题标题】:Why is it IEnumerable.Empty<T>() and not IEnumerable<T>.Empty()?为什么是 IEnumerable.Empty<T>() 而不是 IEnumerable<T>.Empty()?
【发布时间】:2011-05-12 04:00:16
【问题描述】:

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

Enumerable.Empty<T>()

请参阅here 了解更多信息。

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

这个方法可以这样使用:

Enumerable<T>.Empty()

这会返回一个空的IEnumerable&lt;T&gt;

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

编辑:错字

【问题讨论】:

  • 这是Enumerable.Empty&lt;T&gt; 不是IEnumerable.Empty&lt;T&gt;
  • fyi 你的意思是 Enumerable.Empty 不是 IEnumerable.Empty,你不能在接口上有静态。
  • 是的,当我发布我的问题时,我意识到原因是因为您显然不能在接口上使用静态方法。此外,Enumerable 不存在。

标签: c# methods static types generics


【解决方案1】:

IEnumerable&lt;T&gt; 是一个接口。
接口不能包含静态成员。

静态方法实际上是在Enumerable类型上,这是一个非泛型static类。
因此,不存在可以包含该方法的Enumerable&lt;T&gt; 泛型类。

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

【讨论】:

  • 阅读 msdn 页面,我不确定我是否明白为什么泛型类型的静态成员是邪恶的。
  • @Gui:他们不是邪恶的;他们只是令人困惑。
  • 请注意,泛型类型的静态字段是多值的。 (每个通用参数化都有自己的字段;这允许您创建T 类型的字段)
【解决方案2】:

有一个名为Enumerable 的静态类定义了这个方法。没有名为Enumerable&lt;T&gt; 的静态类。这是因为EnumerableIEnumerable&lt;T&gt; 上定义了扩展方法(所有这些方法都有一个泛型参数T)并且扩展方法不能存在于泛型类中。这就是为什么 Empty&lt;T&gt; 被这样定义的原因。

来自规范的 §10.6.9:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多