解决方法重载时有没有优先权?

Thi*_*a H 4 c# generics overloading

为什么执行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[]");
    }
}
Run Code Online (Sandbox Code Playgroud)

Dr.*_*len 5

这是因为重载解析。

这是一篇好文章

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

在此输入图像描述

  • +1 表示漂亮的图像,-1 是因为它对所讨论的特定情况没有帮助(至少在没有关于 param[] 如何适合那里的附加信息的情况下)。 (2认同)

Mar*_*arc 5

对您的问题的评论包含C#的重载解析规范的链接,其中包含您需要深入回答问题的所有信息.这不是最简单的阅读,但在你的情况下很难找到解决方案的实际路径,所以这就是我所能说的:

参数数组:

首先,我们需要查看params关键字的作用:因为它是开发人员方便的捷径,所以它与以下内容完全相同:

static void TestMethod<T>(params T[] input)
Run Code Online (Sandbox Code Playgroud)

被翻译成

static void TestMethod<T>(T[] item)
Run Code Online (Sandbox Code Playgroud)

和调用相应地进行翻译:

TestMethod("string2", "string2");
Run Code Online (Sandbox Code Playgroud)

被翻译成:

TestMethod(new string[] { "string1", "string2" );
Run Code Online (Sandbox Code Playgroud)

解析度:

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

你的电话是:

TestMethod("string"); 
Run Code Online (Sandbox Code Playgroud)

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

TestMethod(new string[] { "string" }); 
Run Code Online (Sandbox Code Playgroud)

这将允许调用泛型版本,同时使用stringas T,这将导致'已解决的方法签名':

TestMethod(string[] item)
Run Code Online (Sandbox Code Playgroud)

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

string[] to string[]
Run Code Online (Sandbox Code Playgroud)

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

string to object
Run Code Online (Sandbox Code Playgroud)

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