2013-08-19 43 views
4

我有一個具有兩個通用參數的類。我想限制第二個泛型參數是與第一個不同的類型。有沒有辦法在編譯時做出這樣的限制?在運行時檢查類型不是很有用。通用參數:確保不同類型

public class Test<A, B> 
    where B : not_typeof(A) 
{ 
    // ... 
} 
+0

事實上,這是一個稍微不同的情況,但最終它是一個@Sam鏈接到 –

+0

的答案是否有其他約束?因爲當你有'在哪裏A:IUtensil','在哪裏B:IVehicle',爲什麼你關心如果用戶有'測試<叉車,叉車>'?它應該工作...你可以添加一些更多的細節嗎? – Kobi

+0

你不能寫這樣的約束,但是當然你可以放上其他的約束來保證類型不能相同,例如,如果'A'必須從'Animal'和'B'類派生出來,必須從'Bicycle'類派生出來,如果這兩個類都不從另一個派生,那麼你就會知道'A'和'B'不能是相同的類型,就像@Kobi所暗示的那樣。類似地,如果有'struct'約束(非空值類型),另一個具有'class'約束(引用類型)。 –

回答

4

唯一的辦法是在運行時。

我修改了我在評論中發佈的answer的答案。

public class Test<A, B> { 

    static Test() { 
     if (typeof(B) == typeof(A)) { 
      throw new NotSupportedException("Argument B is not supported."); 
     } 
    } 
} 
+0

這是我目前正在使用的解決方案。它的工作原理,但它很討厭,因爲你只能在運行時看到你的錯誤。我正在尋找一個在編譯時工作的解決方案。不過,我會將您的帖子標記爲答案,因爲目前似乎沒有辦法在編譯時進行此類限制。 – Shinja