C#重载方法匹配问题:为何优先调用泛型params方法而非object参数版本
C# 重载匹配问题解释
示例代码
using System; public class Test { static void Main() { PrintMethod("Hello World"); } static void PrintMethod(object x) { Console.WriteLine("object called"); } static void PrintMethod<T>(params T[] x) { Console.WriteLine("params T method called[]"); } }
原因说明
这个现象是C#固定的重载解析优先级规则导致的,核心逻辑如下:
- 调用
PrintMethod时传入的参数是string类型的"Hello World",对于带params参数的泛型重载PrintMethod<T>(params T[] x),编译器可以直接推断出类型参数T为string;同时params参数本身支持直接传入单个对应类型的元素(编译器会自动把单个元素封装为T[]数组),整个匹配过程不需要做任何类型转换。 - 如果要匹配参数为
object的非泛型重载,需要把string类型隐式向上转换为object,存在隐式转换成本。 - C#重载解析规则中,无类型转换的匹配优先级永远高于需要隐式转换的匹配,所以编译器最终选择了泛型params重载,而非object参数的重载。
内容的提问来源于stack exchange,提问作者Shristi
相关产品推荐
相关产品推荐

