我有以下方法:
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>
的情况下,为什么它没有采用第二种方法?如何实现预期的重载?
答案 0 :(得分:6)
因为它认为TItem
是string[].
从编译器的角度看这个:它只知道它正在寻找一个插入该方法的泛型类型。它恰好是string []是一种类型。因为这里的含义可能有些模糊,所以你需要给编译器一些帮助来选择你在这里寻找的重载:
Say<string>(new string[]{"Foo", "Bar"});
应该足以让它选择你真正想要的方法。