5

为什么执行TestMethod<T>(params T[] input)方法而不是执行TestMethod(object input)。我很困惑为什么编译器执行通用方法。.net 框架上是否有任何优先级层次结构?

class TestClass
{
    static void Main()
    {
        TestMethod("Hello World");
    }

    static void TestMethod(object input)
    {
        Console.WriteLine("object");
    }

    static void TestMethod<T>(params T[] input)
    {
        Console.WriteLine("params T[]");
    }
}
4

2 回答 2

5

这是因为重载决议。

这是一篇好文章

类似问题: 通用过载解决方案

在此处输入图像描述

于 2013-10-16T09:36:57.720 回答
5

对您的问题的评论包含指向 C# 的重载解析规范的链接,其中包含您深入回答问题所需的所有信息。不过,这不是最容易阅读的,而且很难在您的情况下找到实际的解决路径,所以据我所知,这就是发生的事情:

参数数组:

首先,我们需要看一下params关键字的作用:由于它是方便开发人员的快捷方式,因此它与以下内容相同:

static void TestMethod<T>(params T[] input)

被翻译成

static void TestMethod<T>(T[] item)

并相应地翻译电话:

TestMethod("string2", "string2");

被翻译成:

TestMethod(new string[] { "string1", "string2" );

解析度:

考虑到这一点,让我们看看编译器做了什么:编译器评估其选项以在运行时解析您的调用。

您的电话是:

TestMethod("string"); 

第一个选项是将此调用转换为:

TestMethod(new string[] { "string" }); 

这将允许在使用stringas时调用通用版本T,这将导致“已解析的方法签名”:

TestMethod(string[] item)

因此,从实际参数类型到所需参数类型的所需转换是

string[] to string[]

选项 b 是将参数解释"string"为我们眼中的参数,如 a string。然后调用非通用版本是可行的。

string to object

转换根据 C# 规范的第 7.4.3.4 节进行评估,为了避免将字符串降级为对象,选择了第一个选项。

于 2013-10-16T10:16:44.493 回答