- 我有一个通用类 A< T >,它实现了 IEnumerable< T[] >。
我想要一个从 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(); } }
现在,这工作得很好,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”示例中运行良好?
请不要建议我通过组合来解决我的问题 - 这是我最后的手段。