gpt4 book ai didi

c# - 为什么 FSharpList 没有 GetEnumerator 方法?

转载 作者:太空宇宙 更新时间:2023-11-03 21:55:11 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

第一部分是显式实现其中一个或两个。对于 IEnumerableIEnumerable<T>这将类似于下面的代码

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

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

所以要调用上面的两个方法你需要像下面这样的代码

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

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

foreach(var item in obj) {
}

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

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

关于c# - 为什么 FSharpList 没有 GetEnumerator 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12610001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com