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

C#能否自动推导泛型类型约束?避免泛型类型重复声明

解答:C#中无法自动从T0推导ClassA的泛型参数来简化ClassB的定义

好问题!遗憾的是,在当前所有稳定版本的C#中,你没法直接实现这种自动推导。C#的泛型类型参数推导规则仅适用于方法调用,完全不支持在类/结构体的定义阶段,从约束条件里自动提取嵌套的泛型参数。

也就是说,你最初写的public class ClassB<T0, T1, T2, T3> where T0 : ClassA<T1, T2, T3>是目前唯一合法的写法——必须把T1、T2、T3作为ClassB的泛型参数显式声明,编译器不会帮你从T0的类型中“抠”出这三个参数。

替代方案:减少代码重复的小技巧

虽然没法简化ClassB的定义,但可以通过其他方式减少调用时的重复代码:

1. 用静态工厂方法实现推导

把ClassB的实例创建逻辑放到静态方法里,利用方法级的泛型推导来省略手动指定所有参数:

public class ClassB<T0, T1, T2, T3> where T0 : ClassA<T1, T2, T3>
{
    // 私有构造函数,强制通过工厂方法创建
    private ClassB() { }

    public static ClassB<T0, T1, T2, T3> Create(T0 instance)
    {
        return new ClassB<T0, T1, T2, T3>();
    }
}

调用的时候就不用写一堆泛型参数了:

var myA = new ClassA<int, string, bool>();
var myB = ClassB.Create(myA); // 编译器自动推导所有泛型参数

2. 重构类型结构(如果场景允许)

如果你的业务逻辑允许,可以让ClassA把它的泛型参数暴露为公开成员,或者定义一个更上层的接口来封装这些类型信息。比如:

public interface IClassAWithTypes
{
    Type Type1 { get; }
    Type Type2 { get; }
    Type Type3 { get; }
}

public class ClassA<T1, T2, T3> : IClassAWithTypes
{
    public Type Type1 => typeof(T1);
    public Type Type2 => typeof(T2);
    public Type Type3 => typeof(T3);
}

这种方式虽然没法简化ClassB的泛型定义,但能让你在ClassB内部方便地获取T1、T2、T3的类型信息,而不需要把它们作为泛型参数传递(如果你的场景只需要运行时类型,而非编译时强类型约束的话)。

总结

C#目前的泛型系统不支持类级别的泛型参数推导,所以你必须显式声明ClassB的所有泛型参数。但通过工厂方法这类技巧,可以大幅减少调用代码的冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:29:33