我有以下程序
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
形式早先与编译器匹配并给出意想不到的答案。
答案 0 :(得分:4)
当调用规范的“更好的函数成员”部分(第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>
的转换更“转换”,所以我们没有达到平局 - 的破坏者否则更喜欢扩展形式的正常形式。