如何为无绑定泛型类型指定泛型约束?
解决方案
要实现无需冗余泛型参数、同时约束T为任意P2<TE>(TE为枚举)派生类的泛型类C2x<T>,可以通过给泛型类P2<TE>添加非泛型基类/接口的方式实现:
具体步骤
- 定义一个非泛型的基类(或接口),作为所有
P2<TE>的公共父类型 - 让泛型类
P2<TE>继承这个非泛型基类 - 在
C2x<T>的泛型约束中,指定T继承自该非泛型基类
示例代码
using System; public enum E1 {} public enum E2 {} // 定义非泛型公共基类 public abstract class P2Base {} // 泛型类P2<TE>继承非泛型基类,保留TE的枚举约束 public class P2<TE> : P2Base where TE : Enum {} // 目标泛型类C2x<T>,仅约束T为P2Base的子类 public class C2x<T> where T : P2Base {} public class Program { public static void Main() { // 正确实例化,无需冗余指定TE参数 C2x<P2<E1>> c1 = new C2x<P2<E1>>(); C2x<P2<E2>> c2 = new C2x<P2<E2>>(); // 支持P2<TE>的派生类 class DerivedP2 : P2<E1> {} C2x<DerivedP2> c3 = new C2x<DerivedP2>(); } }
原方案错误原因说明
C21<T>:P2是泛型类,必须指定类型参数,直接写P2属于语法错误C22<T>:C#不允许在泛型约束中使用未绑定的泛型类型(如P2<>)C23<T>:TE未定义为泛型参数,编译器无法识别该类型C24<T>:TE不是C24<T>的泛型参数,无法在约束中引用C25<T, TE>:需要冗余指定TE参数,且存在传错TE导致编译失败的风险(如示例中C25<P2<E1>, E2>)
内容的提问来源于stack exchange,提问作者Carsten Scholtes
相关产品推荐
相关产品推荐

