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

C#如何在泛型方法中调用非泛型重载实现按类型参数取值

问题根因

该现象由C#的重载决议执行时机导致:

  • 直接调用GetItem(default(int))时,参数类型在编译期完全确定,编译器会直接匹配到对应类型的非泛型GetItem重载,运行符合预期
  • Get<T>()内部的GetItem(default(T))调用中,T属于未绑定的泛型参数,编译期无法确认它对应T1还是T2,因此编译器只会选择适配所有情况的泛型GetItem<T>重载,导致每次调用都走抛异常的分支。

解决方案1:类型直接匹配(推荐,无额外性能开销)

直接在Get<T>()内部做类型判断返回对应值,不需要依赖重载逻辑,也不需要保留现有的GetItem方法:

public T Get<T>()
{
    if (typeof(T) == typeof(T1))
    {
        return (T)(object)_item1;
    }
    if (typeof(T) == typeof(T2))
    {
        return (T)(object)_item2;
    }
    throw new ArgumentException($"当前MyClass实例不包含类型为 {typeof(T)} 的元素");
}

该方案完全满足你不暴露Item1/Item2公开属性的要求,同时没有额外运行时开销,泛型参数数量固定的场景下优先使用。


解决方案2:动态调度实现运行时重载匹配

如果你需要保留现有的GetItem重载逻辑(比如后续要扩展更多泛型参数不想反复修改Get<T>实现),可以将调用参数标记为dynamic,让重载决议延迟到运行时执行:

public T Get<T>()
{
    return GetItem((dynamic)default(T));
}

该方案会产生轻微的动态调度开销,但扩展性更好,后续新增T3/T4等泛型参数时,只需要加对应的GetItem(T3 _)/GetItem(T4 _)重载即可,无需修改Get<T>方法的代码。


内容的提问来源于stack exchange,提问作者fnzr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:36:04