与C#中的正确过载不匹配
本文关键字:不匹配 | 更新日期: 2023-09-27 18:28:29
我有以下程序
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Program
{
public static string Foo<T>(params T[] items)
{
return "A";
}
public static string Foo<T>(IEnumerable<T> items)
{
return "B";
}
static void Main()
{
List<int> items = new List<int>(){0,1,23};
Console.WriteLine(Foo(items));
Console.WriteLine(Foo("XXX"));
}
}
输出
A
A
而不是
B
A
既然List是IEnumerable的一个子类,为什么泛型params
形式与编译器早期匹配并给出意外的答案。
当调用规范的"更好的函数成员"部分(第7.5.3.2节)时,所考虑的参数列表为扩展形式(因为第一个方法仅适用于其扩展形式)。在这一点上,您正在比较两个类似的调用:
public static string Foo<T>(T[] items)
Foo(new[] { items });
和
public static string Foo<T>(IEnumerable<T> items)
Foo(items);
从List<int>[]
到List<int>[]
的转换比从List<T>
到IEnumerable<T>
的转换"更好",所以我们没有达到平局决胜局的程度,否则更喜欢普通形式而不是扩展形式。