gpt4 book ai didi

c# - 解析方法重载时有优先级吗?

转载 作者:太空狗 更新时间:2023-10-30 00:25:04 24 4
gpt4 key购买 nike

为什么执行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[]");
}
}

最佳答案

您的问题的评论包含指向 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 节评估转换,为避免将字符串降级为对象,选择第一个选项。

关于c# - 解析方法重载时有优先级吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19399382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com