为什么c#方法重载不能像预期的那样工作?

本文关键字:工作 方法 重载 不能 为什么 | 更新日期: 2023-09-27 18:05:15

我有以下方法:

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>的情况下,为什么它不选择第二种方法?如何实现预期的重载?

为什么c#方法重载不能像预期的那样工作?

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

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

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