1

我正在尝试在 C# 中使用 FSharpList 来实现。它说它实现了IEnumerable接口,但是当我创建它的实例时,它没有任何GetEnumerator功能!

4

1 回答 1

4

确实如此,但您需要将其转换为 IEnumerable 或在 foreach 中使用它。它是明确定义的,因此不会出现在智能感知中,除非声明的类型是 IEnumerable

编辑 从评论中我意识到上面的内容可能与预期不同。

接口方法的显式实现基本上是消歧机制的一部分。如果一个类型使用一个或多个具有相同签名(忽略返回类型)的方法实现两个接口,您需要能够区分它们。

第一部分是明确地实现其中一个或两个。对于这将类似于下面的IEnumerable代码IEnumerable<T>

object IEnumerable.GetEnumerator(){...}
T IEnumerable<T>.GetEnumerator(){...}

消歧的第二部分是在呼叫现场。即使这两种方法都是对象的运行时类型的一部分,您也不能使用常规调用语法来调用它。您需要告诉编译器定义该方法的编译时类型,否则编译器将不知道要调用哪个方法。

因此,要调用上述两种方法,您需要如下代码

((IEnumerable)obj).GetEnumerator();
((IEnumerable<T>)obj).GetEnumerator();

或者您可以将其留给语言构造为您转换(在这种情况下,语言规范会告诉您将调用哪个版本

foreach(var item in obj) {
}

因此,即使这些方法实际上是对象类型的一部分,您也需要在编译时帮助编译器并告诉编译器哪个类型定义了您希望调用的特定方法。

当然可以毫无歧义地使用显式实现。

于 2012-09-26T20:46:35.307 回答