为什么这个C#方法重载不能按预期工作?
我有以下方法:为什么这个C#方法重载不能按预期工作?,c#,.net,generics,C#,.net,Generics,我有以下方法: public void Say<TItem>(TItem item) { Console.WriteLine("A"); } public void Say<TItem>(IEnumerable<TItem> items) { Console.WriteLine("B"); } 注意:将IEnumerable更改为TItem[]确实可以按预期工作,但是在IEnumerable的情况下,为什么不选择第二种方法?如何实现预期的重
public void Say<TItem>(TItem item)
{
Console.WriteLine("A");
}
public void Say<TItem>(IEnumerable<TItem> items)
{
Console.WriteLine("B");
}
注意:将
IEnumerable
更改为TItem[]
确实可以按预期工作,但是在IEnumerable
的情况下,为什么不选择第二种方法?如何实现预期的重载?因为它认为TItem
是string[]。
从编译器的角度来看这一点:它只知道它正在寻找一个泛型类型来插入该方法。碰巧string[]是一种类型。由于此处的含义可能不明确,因此需要向编译器提供一些帮助,以选择要在此处查找的重载:
Say<string>(new string[]{"Foo", "Bar"});
Say(新字符串[]{“Foo”,“Bar”});
如果参数类型是
string[]
而不是IEnumerable
?@MaYaN,那么在这两种情况下,您的调用都可能匹配两个签名,那么为什么不需要这个额外的帮助呢。当该方法采用IEnumerable
时,需要一个隐式转换来匹配,而另一个方法不需要这样的转换。在编者看来,这使得第一个重载更接近匹配。当您变得更具体时,编译器能够更好地推断您试图执行的操作。
A
A
Say<string>(new string[]{"Foo", "Bar"});