Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个C#方法重载不能按预期工作?_C#_.net_Generics - Fatal编程技术网

为什么这个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"});