用一个例子说明它:
??? public class Foo<T> where T:(ClassA || ClassB){}
是否可以在或关系中限制多个无关类的T(T是ClassA或ClassB,但没有别的)或唯一的方法实现这一目标要么
并将它们用作约束?
所以,为了说清楚:我的问题不关心你是否可以 n n 对 n 变量数量的通用约束,我想知道我是否对于同一个变量,可以有 n 个约束条件。
答案 0 :(得分:3)
我会为两者实现不同类型的逻辑并返回相应的逻辑。当然,这可以使用接口来完成。
即使您可以保证两种类型都具有完全相同的成员,编译器也无法验证这一点。
通过让两个类实现相同的接口,您可以向编译器保证它们至少共享接口的成员,并且这些成员可供通用类使用。这就是接口存在的原因以及泛型的全部要点。
答案 1 :(得分:2)
不,如果你考虑一下,它就不会非常有用。
应用泛型约束的目的是确保代码能够对类型执行某些操作。例如。 new()
约束确保您可以执行new T()
,这对于无约束类型是不可能的。但是应用&#34;或&#34;约束不为T
提供任何有用的静态保证,因此您无法将其用于任何事情。
你可以对单个类型变量有多个约束,但它们是&#34;和&#34;约束,即它们都必须得到满足。
答案 2 :(得分:1)
如果我做对了,你基本上想要将表达式作为约束的一部分进行评估,据我所知,它是不可能的。
类型参数可以有多个约束,但不是表达式。请参阅this example:
class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
// ...
}
这里T
肯定有多个约束,但不是表达式。
在这种情况下,您可能希望看一下您的设计,以消除您的问题。
答案 3 :(得分:0)
简短回答是:否,你不能。其他人已经解释了原因,但总之,你会失去仿制药带来的类型安全性。
如果由于某种原因你仍然需要这个,有一个解决方案来使用方法重载,编译器完成剩下的工作。
public void Foo<T>(T instance) where T : ClassA
{
GenericFoo(instance);
}
public void Foo<T>(T instance) where T : ClassB
{
GenericFoo(instance);
}
private void GenericFoo(object instance)
{
// Do stuff
}