多个IEnumerable实现悖论

ptk*_*vsk 5 c# ienumerable inheritance

  1. 我有一个泛型类A < T >,它实现了IEnumerable < T [] >.
  2. 我想要一个从A < char > 继承并实现IEnumerable < string > 的便利包装器B.

    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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在,这完全正常,foreach变量类型被推断为字符串:

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

但这不会编译,说"无法从使用中推断出类型参数,请尝试明确指定类型参数":

string[] strings = b.ToArray();
Run Code Online (Sandbox Code Playgroud)

但是,这有效:

string[] strings = b.ToArray<string>();
Run Code Online (Sandbox Code Playgroud)

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

显然,B同时实现了IEnumerable < 的char [] >和IEnumerable < 字符串 >大概也想不通我想打电话给其他们,但为什么它的工作原理"的foreach"样本中的罚款?

请不要建议我通过作文来解决我的问题 - 这是我的最后选择.

Dan*_*rth 2

区别如下:

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

ToArray另一方面是 上的扩展方法IEnumerable<T>。由于您的类是两者,IEnumerable<string>并且两个通用参数和IEnumerable<char[]>之间的调用不明确。stringchar[]