我可以使用递归约束来定义泛型 class
Can I use recursive constraints to define a generic class
在我最喜欢的项目之一中,我发现自己经常使用泛型,我想知道是否可以在泛型中使用递归约束 class。
假设我有以下界面
public interface IAmSpecial {}
和实现它的 classes 可以各自处理 class
public class SpecialHandler<T> where T: IAmSpecial {}
我想定义一个对任何 SpecialHandler
通用的 class
public class SpecialWrapperHandler<T> where T : SpecialHandler<SpecialT> where SpecialT: IAmSpecial
{
public SpecialWrapperHandler(T t){}
}
无法编译。我可以使用以下签名
定义 SpecialWrapperHandler
class
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 不会产生很多答案...
为处理程序传入第二个类型参数。这样您就可以输入两个参数。
像这样:
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);
}
在我最喜欢的项目之一中,我发现自己经常使用泛型,我想知道是否可以在泛型中使用递归约束 class。
假设我有以下界面
public interface IAmSpecial {}
和实现它的 classes 可以各自处理 class
public class SpecialHandler<T> where T: IAmSpecial {}
我想定义一个对任何 SpecialHandler
通用的 classpublic class SpecialWrapperHandler<T> where T : SpecialHandler<SpecialT> where SpecialT: IAmSpecial
{
public SpecialWrapperHandler(T t){}
}
无法编译。我可以使用以下签名
定义SpecialWrapperHandler
class
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 不会产生很多答案...
为处理程序传入第二个类型参数。这样您就可以输入两个参数。
像这样:
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);
}