我正在尝试在 C# 中使用 FSharpList 来实现目的。它说它实现了IEnumerable接口,但是当我创建它的实例时,它没有任何GetEnumerator功能!
确实如此,但您需要将其转换为 IEnumerable 或在 foreach 中使用它。它是显式定义的,因此不会显示在智能感知中,除非声明的类型是 IEnumerable
编辑 从评论中我意识到上面的内容可能与预期的不同。
接口方法的显式实现基本上是消歧机制的一部分。如果一种类型实现了两个接口,并且具有一个或多个具有相同签名的方法(忽略返回类型),则您需要能够区分它们。
第一部分是明确实现其中一个或两个。对于IEnumerable这IEnumerable<T>将类似于下面的代码
object IEnumerable.GetEnumerator(){...}
T IEnumerable<T>.GetEnumerator(){...}
Run Code Online (Sandbox Code Playgroud)
消歧的第二部分是在调用站点。即使这两种方法都是对象运行时类型的一部分,您也不能使用常规调用语法来调用它。您需要告诉编译器定义该方法的编译时类型,否则编译器将不知道要调用哪个方法。
因此,要调用上述两个方法,您需要如下代码
((IEnumerable)obj).GetEnumerator();
((IEnumerable<T>)obj).GetEnumerator();
Run Code Online (Sandbox Code Playgroud)
或者您可以将其留给语言构造来为您进行转换(在这种情况下,语言规范会告诉您将调用哪个版本
foreach(var item in obj) {
}
Run Code Online (Sandbox Code Playgroud)
因此,即使这些方法实际上是对象类型的一部分,您也需要在编译时帮助编译器并告诉编译器哪种类型定义了您希望调用的特定方法。
当然可以毫无歧义地使用显式实现。