为什么FSharpList没有GetEnumerator方法?

时间:2012-09-26 20:38:35

标签: c# f#

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

1 个答案:

答案 0 :(得分:4)

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

修改 从评论中我意识到上述内容可能与预期不同。

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

第一部分是明确地实施其中一个或两个。对于IEnumerableIEnumerable<T>,其类似于以下代码

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

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

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

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

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

foreach(var item in obj) {
}

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

当然可以毫不含糊地使用显式实现。