两种GetEnumerator方法?

时间:2019-01-28 19:35:23

标签: c# .net

我真的不明白为什么在此示例中,此类定义了两个 GetEnumerator 方法:一个明确实现接口,而另一个隐式< / strong>。那为什么呢?

def pip_install(package_name):
    subprocess.call(
        [sys.executable, '-m', 'pip', 'install', package_name]
    )

2 个答案:

答案 0 :(得分:7)

  

为什么[...]此类定义两个GetEnumerator方法:

好吧,一个是通用的,另一个不是通用的。
非通用版本是.NET v1中的遗物,比通用更早。

您有class FormattedAddresses : IEnumerable<string>,但是IEnumerable<T>源自旧界面IEnumerable

所以它实际上是class FormattedAddresses : IEnumerable<string>, IEnumerable,您的类必须同时实现两者。两种方法的返回类型不同,因此不适用重载或覆盖。

请注意,旧版本是“明确”实施的,将其尽可能隐藏,并且不实施通常是可以接受的:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    throw new NotImplemented();
}

只有在功能强大的库类(而不是应用程序类)中,您才需要使其真正起作用。

答案 1 :(得分:2)

第二种方法实现该方法的非泛型版本。它是一个显式的接口实现,以避免名称冲突(重载不能仅因返回类型而异)。

无论如何都应删除整个班级。保留FormattedAddress的列表,不要为其创建自定义列表类!