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

时间:2016-08-31 21:51:06

标签: c# .net generics

我有以下方法:

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 个答案:

答案 0 :(得分:6)

因为它认为TItemstring[].从编译器的角度看这个:它只知道它正在寻找一个插入该方法的泛型类型。它恰好是string []是一种类型。因为这里的含义可能有些模糊,所以你需要给编译器一些帮助来选择你在这里寻找的重载:

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

应该足以让它选择你真正想要的方法。