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

能否从另一个泛型类型中获取泛型参数并实现自动推导使用?

结论

当前C#语言规范不支持你想要的这种用法,无法只传入前两个泛型参数,让编译器自动从泛型约束中推导出第三个参数T2。

原因说明

  • C#的泛型类型实例化规则是:要么所有泛型参数都显式指定,要么所有泛型参数都可以通过构造函数的入参完全推导,不存在「部分显式指定、部分从约束自动推导」的语法规则。
  • 泛型约束(where子句)的作用仅为校验传入的泛型参数是否符合要求,不会作为泛型参数推导的依据,也不会自动补全未声明/未传入的泛型参数。

替代实现方案

根据你的使用场景,可以选下面两种方案实现类似的简写效果:

  1. 用工厂方法做泛型推导
    C#的方法泛型参数支持更灵活的推导逻辑,你可以封装一个静态工厂方法,省去手动写T2的步骤:
    public static class TypeBFactory
    {
        // 传入T3的实例用于泛型推导
        public static TypeB<T1, T3, T2> Create<T1, T3, T2>(T3 instance) where T3 : TypeA<T2>
        {
            return new TypeB<T1, T3, T2>();
        }
    }
    
    // 使用时传入TypeA实例即可,不需要显式写T2
    TypeBFactory.Create<string>(new TypeA<int>());
    
  2. 运行时反射取泛型参数(仅适用于不需要编译时强类型校验T2的场景)
    如果你只是在运行时需要拿到T2的类型,不需要在编译期用T2做类型约束、方法返回值声明等操作,可以调整泛型定义,在类内部通过反射读取参数:
    // 定义非泛型基类用于约束
    public abstract class TypeA { }
    public class TypeA<T2> : TypeA { }
    
    // 去掉T2泛型参数,用基类做约束
    public class TypeB<T1, T3> where T3 : TypeA
    {
        // 运行时获取T2的类型
        public Type T2Type => typeof(T3).GetGenericArguments()[0];
    }
    
    // 直接用你期望的写法实例化
    new TypeB<string, TypeA<int>>();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:42:01