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
相关产品推荐
相关产品推荐

