ptk*_*vsk 5 c# ienumerable inheritance
我想要一个从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"样本中的罚款?
请不要建议我通过作文来解决我的问题 - 这是我的最后选择.
区别如下:
foreach实际上寻找一个名为 的公共方法GetEnumerator。它并不真正关心IEnumerable<T>。您的类B只有一个名为 的公共方法GetEnumerator: 中定义的方法B隐藏了中定义的方法A。
ToArray另一方面是 上的扩展方法IEnumerable<T>。由于您的类是两者,IEnumerable<string>并且两个通用参数和IEnumerable<char[]>之间的调用不明确。stringchar[]