2012-06-27 46 views
1

我有一個通用的基類,我想允許兩種ITestIBoldface之一。錯誤執行泛型類與類型約束

我的基類是這樣的:

public abstract class BaseTestingCollections<T> where T : ITest, IBoldface 
{ 
... 
} 

一個繼承它看起來像這樣的類:

public class TestCollection : BaseTestingCollections<ITest>, ITestCollection 
{ 
... 
} 

當我編譯我得到這個錯誤:

類型DomainLogic.ITest'不能用作泛型類型或方法'DomainLogic.BaseTestingCollections'中的類型參數'T'。沒有從「DomainLogic.ITest」到「DomainLogic.IBoldface」的隱式引用轉換。

+4

逗號不是**或**,它們是**和**。 –

回答

4

這樣的一個/或限制不能完成(因爲我敢肯定你已經注意到,逗號更像&&||)。您可以創建兩個不同名稱的抽象類(一個是BaseTestingCollectionsTest<T> where T : ITest,另一個是BaseTestingCollectionsBoldface<T> where T : IBoldface),或者刪除靜態限制並在運行時進行檢查。或者讓其中一個ITestIBoldface擴展另一個,或擴展一個通用接口,如果它們共享成員。

下面是在運行時檢查的例子:

public abstract class BaseTestingCollections<T> 
{ 
    public BaseTestingCollections() 
    { 
     if (!typeof(ITest).IsAssignableFrom(typeof(T)) && !typeof(IBoldface).IsAssignableFrom(typeof(T))) 
      throw new Exception(); 
    } 
} 
3

那麼你不satistfying您指定的約束。 T必須擴展/實現ITestIBoldFace

您的約束並不意味着它必須擴展/實現類型一個 - 它必須做。類型參數必須滿足所有類型約束才能生效。

更多信息請參見MSDN on generic constraints

+2

我已經厭倦了你的「我要回答這個問題比你快10秒」的態度。 :D –

3

每自己的泛型約束,只有那些實現類型都ITestIBoldface是您BaseTestingCollection類適當的通用參數。

這不是非此即彼的,怎麼會是誰?當你調用從ITest接口方法BarT只實現IBoldFace,這反過來又沒有定義方法Bar會發生什麼?面對這種情況時,編譯器要做什麼?

沒有合理的行動。您的約束條件同時適用於泛型參數。

2

你不能表達與C#泛型的「非此即彼」的約束這樣的。使用一個共同的基礎界面某種:

interface ITestOrBold {} 
interface ITest : ITestOrBold {} 
interface IBoldface : ITestOrBold {} 

class BaseTestingCollections<T> where T : ITestOrBold {} 

顯然代替ITestOrBold你應該有一些明智的抽象。

+0

不應該'IBoldface'繼承自'ITestOrBold'嗎? – hatchet

+0

@hatchet哎呀,謝謝你指出。 – millimoose