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)
对您的问题的评论包含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)
这将允许调用泛型版本,同时使用string
as 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进行评估,并且为了避免将字符串降级为对象,选择第一个选项.