gpt4 book ai didi

c# - 什么时候调用 IEnumerable.GetEnumerator 而不是 IEnumerable.GetEnumerator?

转载 作者:太空狗 更新时间:2023-10-29 18:16:27 25 4
gpt4 key购买 nike

查看这段代码:

public class myWords : IEnumerable<string>
{
string[] f = "I love you".Split(new string[]{"lo"},StringSplitOptions.RemoveEmptyEntries);

public IEnumerator<string> GetEnumerator()
{
return f.Select(s => s + "2").GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return f.Select(s => s + "3").GetEnumerator();
}
}

运行:

 myWords m = new myWords();
foreach (var s in m)
{
Console.WriteLine(s);
}

产量

I 2
ve you2 // notice "2", so the generic Ienumerator has executed.

我了解非通用 IEnumerator 版本是为了兼容性。

问题:

  1. 在什么情况下会调用非泛型?
  2. 如何强制我的代码使用非通用 IEnumerator 运行?

最佳答案

只要代码将类转换为非通用接口(interface),就会执行非通用 IEnumerator:

((IEnumerable)myWords).GetEnumerator(); // this calls the non-generic one

如果您将您的类传递给某些需要非通用 IEnumerator 的遗留函数,这将非常相关。

因此,如果您有一些包含函数的库并将您的类传递给该函数,它将使用非泛型 IEnumerator

DoSomeStuffWithAnIEnumerable(IEnumerable x)
{
var foo = x.GetEnumerator();

// or, as stackx said, an example with foreach:
foreach (var foo2 in x)
Console.WriteLine(foo2);
}


DoSomeStuffWithAnIEnumerable(new myWords());


请注意,使用通用的 IEnumerator 简单地实现非通用的 IEnumerator 是完全有效的:

public class myWords : IEnumerable<string>
{
....
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}

这样您就可以确定它们具有相同的效果。

关于c# - 什么时候调用 IEnumerable.GetEnumerator 而不是 IEnumerable<T>.GetEnumerator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909326/

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