我可以做這樣的事情:通用方法與指定類型
public void Foo<T>(int param) where T: MYCLASS1, MYCLASS2
要指定T將只MyClass1的或MYCLASS2實例?
謝謝。
我可以做這樣的事情:通用方法與指定類型
public void Foo<T>(int param) where T: MYCLASS1, MYCLASS2
要指定T將只MyClass1的或MYCLASS2實例?
謝謝。
沒有,當你指定泛型類型的限制,泛型類型參數必須滿足所有的約束,而不只是其中之一。你寫的代碼意味着T
必須繼承MYCLASS1
和MYCLASS2
,這是不可能的,因爲C#不支持多重繼承。所述類型約束可以是以下的組合:
new()
約束(即類型必須有一個參數構造)struct
或class
(但不是兩者,因爲類型不能是值類型和引用類型)你不能那樣做。
在泛型上添加約束時,只能列出一個類,而其他類必須是接口。
這是一個有效的約束 -
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
。
不,一般的約束總是和在一起。你將不得不做一個運行時檢查:
public void Foo<T>(int param) {
if (typeof(T) != typeof(MyClass1) && typeof(T) != typeof(MyClass2))
throw new ArgumentException("T must be MyClass1 or MyClass2");
// ...
}
因爲Thomas指出,你不能這樣做。但是什麼你可以做的是:
public void Foo<T>(int param) where T: IMyInterface
只要你知道,無論MYCLASS1
和MYCLASS2
實施IMyInterface
正如其他人說:沒有。如果你詳細說明這個函數使用了什麼類型,或許你會有更好的方法去做這件事。 – 2011-03-18 16:20:35
你是對的..我想我必須使用多態性..謝謝 – bAN 2011-03-18 16:24:53