我可以这样做:
public void Foo<T>(int param) where T: MYCLASS1, MYCLASS2
要指定T只是MYCLASS1或MYCLASS2实例?
谢谢..
答案 0 :(得分:6)
不,当您指定泛型类型约束时,泛型类型参数必须满足所有约束,而不仅仅是其中之一。您编写的代码意味着T
必须继承MYCLASS1
和MYCLASS2
,这是不可能的,因为C#不支持多重继承。泛型类型约束可以是:
new()
约束(即类型必须具有无参数构造函数)struct
或class
(但不是两者,因为类型不能是值类型且是引用类型)答案 1 :(得分:1)
你做不到。
在泛型类型上添加约束时,您只能列出一个类,而其他类必须是接口。
这是一个有效的约束 -
public void Foo<T>(int param) where T: MyClass1, IInterface1, IInterface2
但不是这个
public void Foo<T>(int param) where T: MyClass1, MyClass2
这是合乎逻辑的,因为当您声明类型为Foo的变量(例如Foo<MyType>
)时,您的MyType
可以来自MyClass1
,IInterface1
和MyInterface2
但它不能同时来自MyClass1
和MyClass2
。
答案 2 :(得分:1)
不,通用约束始终是AND。您将不得不进行运行时检查:
public void Foo<T>(int param) {
if (typeof(T) != typeof(MyClass1) && typeof(T) != typeof(MyClass2))
throw new ArgumentException("T must be MyClass1 or MyClass2");
// ...
}
答案 3 :(得分:0)
正如Thomas指出的那样,你不能这样做。你可以做的是:
public void Foo<T>(int param) where T: IMyInterface
只要您知道MYCLASS1
和MYCLASS2
都实施IMyInterface