C# 多重IEnumerable实现悖论 我有一个实现IEnumerable的泛型类a
我想要一个方便的包装器B,它从a继承并实现IEnumerable 但这不会编译,会说“无法从用法推断类型参数,请尝试显式指定类型参数”: 然而,这是可行的:C# 多重IEnumerable实现悖论 我有一个实现IEnumerable的泛型类a,c#,inheritance,ienumerable,C#,Inheritance,Ienumerable,我想要一个方便的包装器B,它从a继承并实现IEnumerable 但这不会编译,会说“无法从用法推断类型参数,请尝试显式指定类型参数”: 然而,这是可行的: string[] strings = b.ToArray<string>(); string[]strings=b.ToArray(); 有人能解释这个编译器行为吗 显然,B实现了IEnumerable和IEnumerable,并且可能无法确定我要调用哪一个,但为什么它在“foreach”示例中工作良好 请不要建议我通过组合
string[] strings = b.ToArray<string>();
string[]strings=b.ToArray();
有人能解释这个编译器行为吗
显然,B实现了IEnumerable和IEnumerable,并且可能无法确定我要调用哪一个,但为什么它在“foreach”示例中工作良好
请不要建议我通过组合来解决我的问题-这是我最后的选择。
foreach
循环不使用IEnumerable
或IEnumerable
实现。您可以使用foreach
,即使您的类没有实现它们中的任何一个。它只需要返回IEnumerator
实现的GetEnumerator
方法
检查此问题:
这就是为什么类使用
foreach
而不使用ToArray()
的原因。区别如下:
foreach
实际上查找名为GetEnumerator
的公共方法。它并不真正关心IEnumerable
。您的类B
只有一个名为GetEnumerator
的公共方法:在B
中定义的方法隐藏在A
中定义的方法
另一方面,ToArray
是对IEnumerable
的扩展方法。由于您的类同时是IEnumerable
和IEnumerable
两个通用参数string
和char[]
之间的调用不明确
B b = new B();
foreach (var s in b)
{
string[] split = s.Split(' ');
}
string[] strings = b.ToArray();
string[] strings = b.ToArray<string>();