C# 多重IEnumerable实现悖论 我有一个实现IEnumerable的泛型类a

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”示例中工作良好 请不要建议我通过组合

我想要一个方便的包装器B,它从a继承并实现IEnumerable

但这不会编译,会说“无法从用法推断类型参数,请尝试显式指定类型参数”:

然而,这是可行的:

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>();