为什么这个C#方法重载没有按预期工作?

3
我有以下几种方法:
public void Say<TItem>(TItem item)
{
    Console.WriteLine("A");
}

public void Say<TItem>(IEnumerable<TItem> items)
{
    Console.WriteLine("B");
}

当我运行以下命令时:
void Main()
{
    Say<string>("Foo");
    Say(new string[] { "Foo", "Bar"});

}

第一种方法被调用了两次:
A
A

注意将 IEnumerable<T> 更改为 TItem[] 可以按预期工作,但在 IEnumerable<T> 的情况下,为什么它没有选择第二个方法?如何实现预期的重载?

1个回答

6

因为编译器认为TItemstring[]类型。从编译器的角度看,它只知道要寻找一个通用类型来插入该方法中。恰巧string[]是一种类型。由于这里的意义可能存在歧义,您需要给编译器一些帮助,以选择您要查找的重载版本:

Say<string>(new string[]{"Foo", "Bar"});

这应该足以让它选择您实际想要的方法。


很好,但是如果参数类型为string[]而不是IEnumerable<T>,为什么不需要这个额外的帮助呢? - MaYaN
1
@MaYaN 在这两种情况下,你的调用可能会匹配两个签名。当方法采用 IEnumerable 时,需要进行隐式转换才能匹配,而对于另一个方法则不需要进行此类转换。在编译器看来,这使得第一个重载更接近匹配。当你变得更具体时,编译器能够更好地推断出你试图做什么。 - pquest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接