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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:42:08