不匹配C#中的正确重载

时间:2013-08-20 11:45:12

标签: c# compiler-construction params overload-resolution

我有以下程序

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形式早先与编译器匹配并给出意想不到的答案。

1 个答案:

答案 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>的转换更“转换”,所以我们没有达到平局 - 的破坏者否则更喜欢扩展形式的正常形式。