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