2009-04-30 113 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类中定义