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

时间:2013-10-16 09:12:11

标签: c# generics overloading

为什么执行TestMethod<T>(params T[] input)方法而不是执行TestMethod(object input)。我很困惑为什么complier执行泛型方法。在.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[]");
    }
}

2 个答案:

答案 0 :(得分: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。然后调用非泛型版本是可行的。

string to object

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

答案 1 :(得分:4)

这是因为重载决议。

这是一个很好的article

类似的问题: Generic Overload Resolution

enter image description here