2011-11-16 134 views
4

我定義泛型類型:(整數的花車或之一)約束泛型類型參數的數值類型

public class Point<T> where T : IConvertible, IComparable 

我真的很想做的是限制噸至是數字型CLR中沒有INumeric。是否有一個接口或一組接口可用於將此類型約束爲其中一個盒裝數字類?

+1

這不是在C#來完成。您最多可以做到這一點有一個新的IPOINT接口那ca n強制執行 –

+0

[C#:通用接口的數字]可能的重複(http://stackoverflow.com/questions/1325131/c-generic-interface-for-numbers) – user7116

回答

11

不幸的是,沒有。這已經是一個highly requested feature很長一段時間了。

現在,最好的選擇是可能使用:

where T : struct, IConvertible, IComparable<T> 

(該結構約束防止串用法...)

然而,這仍然允許實現任何用戶定義的值類型使用適當的限制條件。

+0

IConvertible將是最大的,將在上面其餘的,防止非數字類型的使用。我想不出有太多的用戶定義類型,外部可能有像Money這樣的「度量單位」類型結構,這會影響實現這個接口;它很可能是.NET中最大的內置接口契約。 – KeithS

+0

字符串實現IConvertible並且是非數字類型。 – phoog

+0

@phoog:這就是爲什麼我建議添加結構約束 - 它可以防止使用字符串... –

1

where T: struct將限制它爲一個值類型。

+0

它仍然可以是任何用戶定義的結構,以及像DateTime這樣的內置非數字結構。 – KeithS

1

一個不是很舒服的方法是檢查構造函數中的有效類型並拋出異常。它的工作原理,但它不是「編譯器安全」,併產生運行時錯誤。 :-(

0

不,你不能做到這一點。 您可以選擇在哪裏T:struct,IConvertible,IFormattable,IComparable將其限制於所有blittable數值類型和枚舉,但即使你沒有限制,你仍然不能T爲使用運營商運營商都是靜態的。

point.X-point.Y 

將泛型不知道靜態成員是非法的。