You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:09:04