2012-04-02 23 views
2

我一直在嘗試以下如何將T限制爲無符號整數?

interface IUIntegral : IEquatable<Byte>, IEquatable<UInt16>, IEquatable<UInt32>, IEquatable<UInt64> { } 
class Counter<T> where T : IUIntegral { 
    T _value; 
} 

有了這個調用代碼

Counter<UInt32> foo = null; 

,但我得到這個編譯器錯誤

Error 1 The type 'uint' cannot be used as type parameter 'T' in the generic type or method 'Test.Counter<T>'. There is no boxing conversion from 'uint' to 'Test.IUIntegral'. 

回答

5

tldr;這種方法不起作用。

C#使用nominative type system(類型是由名字確定的)和未一個structural type system(類型由數據/操作來確定)。

unit32IUIntegral是沒有關係的:即使它們共享相同的結構

如果一個類型必須與Equatable這本身可以參照類型的類型限制來完成(他們不反正uint32不符合IEquatable<byte>。)

class Counter<T> where T : IEquatable<T> { 
    T _value; 
} 
+0

感謝您的真棒解釋。有沒有什麼辦法來限制C#中的類型?我一直在閱讀'CodeContracts',但似乎無法找到有關靜態斷言的任何文檔。我希望他們可以工作。 – 2012-04-02 02:26:27

+1

@NickStrupat在類型層次上,你幾乎只限於'T:uint32','T:IEquatable ','T:IEquatable '(這可能適合你)或者更廣泛的東西。我還沒有玩過代碼合同,所以我不知道它們是如何工作的。 – 2012-04-02 02:30:26

相關問題