gpt4 book ai didi

c# - 多个 IEnumerable 实现悖论

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

  1. 我有一个通用类 A<T>,它实现了 IEnumerable<T[]>。
  2. 我想要一个方便的包装器 B,它继承自 A<char> 并实现 IEnumerable<string>。

    public class A<T> : IEnumerable<T[]>
    {
    public IEnumerator<T[]> GetEnumerator()
    {
    return Enumerate().GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
    return GetEnumerator();
    }

    protected IEnumerable<T[]> Enumerate()
    {
    throw new System.NotImplementedException();
    }
    }

    public class B : A<char>, IEnumerable<string>
    {
    public IEnumerator<string> GetEnumerator()
    {
    return Enumerate().Select(s => new string(s)).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
    return GetEnumerator();
    }
    }

现在,这工作得很好,foreach 变量类型被推断为字符串:

B b = new B();
foreach (var s in b)
{
string[] split = s.Split(' ');
}

但这不会编译,说“无法从用法中推断出类型参数,请尝试显式指定类型参数”:

string[] strings = b.ToArray();

但是,这是可行的:

string[] strings = b.ToArray<string>();

谁能解释这个编译器的行为?

显然,B 实现了 IEnumerable<char[]> 和 IEnumerable<string> 并且它可能不知道我想调用它们中的哪一个,但是为什么它在“foreach”示例中运行良好?

请不要建议我通过组合来解决我的问题 - 这是我的最后手段。

最佳答案

区别如下:

foreach实际上寻找一个名为 GetEnumerator 的公共(public)方法.它并不真正关心 IEnumerable<T> .你的类B只有一个名为 GetEnumerator 的公共(public)方法: B 中定义的那个隐藏 A 中定义的那个.

ToArray另一方面是关于 IEnumerable<T> 的扩展方法.因为你的类(class)都是IEnumerable<string>IEnumerable<char[]>两个通用参数之间的调用不明确 stringchar[] .

关于c# - 多个 IEnumerable 实现悖论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652974/

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