2009-04-30 121 views
49

我有以下方法與通用的類型:如何定義基本類型的泛型類型限制?

T GetValue<T>(); 

我想至T限制爲原始類型如int,串,浮點但不是類類型。我知道我可以像這樣定義類的類型:

C GetObject<C>() where C: class; 

我不確定原始類型是否可能,以及如果是這樣。

回答

42

您可以使用它來限制它的值類型:

where C: struct 

你還別說字符串。不幸的是,字符串不會被允許,因爲它們不是值類型。

+0

但不能用於字符串以下的樣品,其可爲空 – 2009-04-30 03:47:56

+1

當然,它可以讓你通過任何用戶定義的結構類型的一些有用的提示,不只是原始類型。除了定義所有內置基元類型的重載之外,我不確定是否有方法。 – 2009-04-30 03:49:14

13

這裏就是你要找的內容:

T GetObject<T>() where T : struct; 
5

什麼是你真正想要的方法呢?這可能是因爲你實際上需要C來實現IComparable或其他接口。在這種情況下,你想要類似

T GetObject<T> where T: IComparable 
9

沒有通用的約束條件來匹配那些乾淨的事情。你究竟想要做什麼?例如,您可以使用運行時檢查(例如靜態ctor)(對於泛型類型 - 對於泛型方法不太容易)來破解它...

但是;大多數時候,我看到這一點,這是因爲人們希望的一個:

  • 能夠檢查物品是否平等:在這種情況下使用EqualityComparer<T>.Default
  • 能夠比較/排序項目:在這種情況下使用Comparer<T>.Default
  • 能夠執行算術:爲generic operators
15

在這種情況下使用MiscUtil的支持其實這樣做的工作,一定程度上:

public T Object<T>() where T : 
    struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> 

要限制數字類型,你可以得到的ValueType類中定義