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

如何为无绑定泛型类型指定泛型约束?

解决方案

要实现无需冗余泛型参数、同时约束T为任意P2<TE>(TE为枚举)派生类的泛型类C2x<T>,可以通过给泛型类P2<TE>添加非泛型基类/接口的方式实现:

具体步骤

  1. 定义一个非泛型的基类(或接口),作为所有P2<TE>的公共父类型
  2. 让泛型类P2<TE>继承这个非泛型基类
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:57:39