解决方法重载时是否有优先级?

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
好的,对于过载决策机制,有一个具体实现。 - Patryk Ćwiek
2个回答

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

这将允许调用通用版本,同时使用string作为T,这将导致“已解决的方法签名”:

TestMethod(string[] item)

因此,需要将实际参数类型转换为所需的参数类型。
string[] to string[]

选项b是将参数“string”解释为我们眼中的内容,即一个字符串。然后调用非泛型版本是可行的。
string to object

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


5

2
对于那张好看的图片点个赞,但是在特定情况下它并没有帮助(至少不在没有关于 param[] 如何适应的附加信息的情况下)。 - Heinzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接