- 我有一个通用的 A 类T>,实现 IEnumerableT[]>.
-
我想要一个继承自 Achar> 并实现 IEnumerablestring>.
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 实现了 IEnumerablechar[]> 和 IEnumerablestring> 可能它无法弄清楚我想调用其中哪一个,但为什么它在“foreach”示例中工作正常?
请不要建议我通过组合来解决我的问题 - 这是我的最后手段。
区别如下:
foreach
实际上寻找一个名为的公共方法GetEnumerator
。它并不真正关心IEnumerable<T>
。你的班B
只有一个名为的公共方法GetEnumerator
: 定义在B
which hides中定义的一个A
.
ToArray
另一方面是一个扩展方法IEnumerable<T>
。因为你的班级都是IEnumerable<string>
and IEnumerable<char[]>
两个通用参数之间的调用不明确string
and char[]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)