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

与C#中的正确过载不匹配

当调用规范的"更好的函数成员"部分(第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>的转换"更好",所以我们没有达到平局决胜局的程度,否则更喜欢普通形式而不是扩展形式。