90

我有以下泛型类型的方法:

T GetValue<T>();

我想将 T 限制为原始类型,例如 int、string、float 但不是类类型。我知道我可以为这样的类类型定义泛型:

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

我不确定原始类型是否可能以及如何。

4

6 回答 6

52

您可以使用它来将其限制为值类型:

where C: struct

您还提到了字符串。不幸的是,不允许使用字符串,因为它们不是值类型。

于 2009-04-30T03:47:19.327 回答
26

实际上,这在一定程度上起到了作用:

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

要限制为数字类型,您可以获得为ValueType类定义的以下示例的一些有用提示

于 2013-12-03T12:37:29.480 回答
18

这是您要查找的内容:

T GetObject<T>() where T : struct;
于 2009-04-30T03:48:02.337 回答
11

没有通用的约束可以完全匹配这组事物。你真正想做的是什么?例如,您可以通过运行时检查来破解它,例如静态 ctor(对于泛型类型 - 对于泛型方法来说并不那么容易)......

然而; 大多数时候我看到这个,这是因为人们想要以下之一:

  • 能够检查项目是否相等:在这种情况下使用EqualityComparer<T>.Default
  • 能够比较/排序项目:在这种情况下使用Comparer<T>.Default
  • 能够执行算术:在这种情况下,请使用MiscUtil通用运算符的支持
于 2009-04-30T04:26:43.193 回答
8

您实际上要在该方法中做什么?可能您实际上需要 C 来实现 IComparable 或其他接口。在这种情况下,您想要类似的东西

T GetObject<T> where T: IComparable
于 2009-04-30T03:58:12.013 回答
0

如果您需要可以使用为托管类型(例如 sizeof 运算符)保留的语言功能的类型,请使用“非托管”。

where C: unmanaged
于 2021-12-28T13:28:39.077 回答