4

我有以下程序

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形式较早地与编译器匹配并给出了意外的答案。

4

1 回答 1

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);

从 to 的转换是比从 toList<int>[]List<int>[]转换“更好的转换” ,所以我们没有达到决胜局的程度,否则它们更喜欢普通形式而不是扩展形式。List<T>IEnumerable<T>

于 2013-08-20T11:53:17.710 回答