2011-03-18 37 views
4

我可以做這樣的事情:通用方法與指定類型

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

要指定T將只MyClass1的或MYCLASS2實例?

謝謝。

+0

正如其他人說:沒有。如果你詳細說明這個函數使用了什麼類型,或許你會有更好的方法去做這件事。 – 2011-03-18 16:20:35

+1

你是對的..我想我必須使用多態性..謝謝 – bAN 2011-03-18 16:24:53

回答

6

沒有,當你指定泛型類型的限制,泛型類型參數必須滿足所有的約束,而不只是其中之一。你寫的代碼意味着T必須繼承MYCLASS1MYCLASS2,這是不可能的,因爲C#不支持多重繼承。所述類型約束可以是以下的組合:

  • 基類(只有一個允許的)
  • 一個或幾個接口
  • new()約束(即類型必須有一個參數構造)
  • 要麼structclass(但不是兩者,因爲類型不能是值類型引用類型)
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派生,IInterface1MyInterface2,但它不能源自MyClass1MyClass2

1

不,一般的約束總是和在一起。你將不得不做一個運行時檢查:

public void Foo<T>(int param) { 
    if (typeof(T) != typeof(MyClass1) && typeof(T) != typeof(MyClass2)) 
     throw new ArgumentException("T must be MyClass1 or MyClass2"); 
    // ... 
} 
0

因爲Thomas指出,你不能這樣做。但是什麼你可以做的是:

public void Foo<T>(int param) where T: IMyInterface 

只要你知道,無論MYCLASS1MYCLASS2實施IMyInterface

相關問題