具有指定类型的通用方法

时间:2011-03-18 16:11:49

标签: c# generics

我可以这样做:

public void Foo<T>(int param) where T: MYCLASS1, MYCLASS2

要指定T只是MYCLASS1或MYCLASS2实例?

谢谢..

4 个答案:

答案 0 :(得分:6)

不,当您指定泛型类型约束时,泛型类型参数必须满足所有约束,而不仅仅是其中之一。您编写的代码意味着T必须继承MYCLASS1MYCLASS2,这是不可能的,因为C#不支持多重继承。泛型类型约束可以是:

的组合
  • 一个基类(只允许一个)
  • 一个或多个接口
  • new()约束(即类型必须具有无参数构造函数)
  • structclass(但不是两者,因为类型不能是值类型是引用类型)

答案 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可以来自MyClass1IInterface1MyInterface2但它不能同时来自MyClass1MyClass2

答案 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

只要您知道MYCLASS1MYCLASS2都实施IMyInterface