如何在C#中约束继承自任意类型泛型类的泛型类型?
C#泛型约束问题解答
你给出的代码写法是不行的,因为T2并没有作为ClassA的泛型参数被声明,编译器无法识别这个未定义的类型参数。
要实现你想要的约束效果,有两种常见方案:
方案1:将T2作为ClassA的泛型参数显式声明
如果需要外部指定T2的类型,可以把T2加入ClassA的泛型参数列表,这样就能在约束中合法引用它:
public class ClassA<T1, T2> : ClassB<T1> where T1 : ClassC<T2> { // ... }
这种方式下,T2可以是任意类型,只要T1继承自ClassC<T2>即可。
方案2:约束T1为任意ClassC的构造类型(C# 7.3+)
如果不需要显式指定T2,只是要求T1是ClassC的任意泛型构造版本,可以使用开放构造类型作为约束(C# 7.3及以上版本支持):
public class ClassA<T1> : ClassB<T1> where T1 : ClassC<> { // ... }
这种写法表示T1必须是ClassC的某个泛型实例(比如ClassC<int>、ClassC<string>等),而不需要关心具体的T2类型。
另外,如果你的目标是允许T1继承自ClassC的任意版本,且T2可以是任何类型(包括值类型),也可以用object作为T2的约束,但这种方式不如开放构造类型灵活——因为泛型类不支持协变,ClassC<int>不会被视为继承自ClassC<object>:
public class ClassA<T1> : ClassB<T1> where T1 : ClassC<object> { // ... }
内容的提问来源于stack exchange,提问作者dbm
相关产品推荐
相关产品推荐

