我可以使用递归约束来定义泛型类

时间:2015-03-13 15:33:25

标签: c# generics

在我的一个宠物项目中,我发现自己使用泛型非常多,我想知道是否可以在泛型类中使用递归约束。

让我们想象一下,我有以下界面

public interface IAmSpecial {}

并且实现它的类可以由它自己的类

处理
public class SpecialHandler<T> where T: IAmSpecial {}

我想定义一个比任何SpecialHandler

更通用的类
public class SpecialWrapperHandler<T> where T : SpecialHandler<SpecialT> where SpecialT: IAmSpecial
{
    public SpecialWrapperHandler(T t){}
}

没有编译。我可以使用以下签名

定义SpecialWrapperHandler
public class SpecialWrapperHandler<T> where T : SpecialHandler<IAmSpecial>
{
    public SpecialWrapperHandler(T t){}
}

但是我无法构建它,因为任何SpecialHandler实现都将关闭IAmSpecial的一个实现上的泛型值。我也不能宣布像

这样的东西
public class SpecialWrapperHandler<SpecialHandler<T>> where T : IAmSpecial

那么有可能有一个C#构造来递归通用约束,所以我可以SpecialWrapperHandler吗?如果是这样,我应该使用什么构造?如果没有,为什么?快速阅读文档中的generics chapter并不会产生很多答案......

1 个答案:

答案 0 :(得分:3)

传入处理程序的第二个类型参数。这样你就可以输入两个参数。

像这样:

public class SpecialWrapperHandler<H, T> where H : SpecialHandler<T> where T : IAmSpecial
{
    public SpecialWrapperHandler(T t){}
}

证明:

public class X : IAmSpecial { }

public class XHandler : SpecialHandler<X> { }

static void Main(string[] args)
{
    X x = new X();
    SpecialWrapperHandler<XHandler, X> v = new SpecialWrapperHandler<XHandler, X>(x);
}