如何定义基本类型的泛型类型限制?


78

我有以下具有通用类型的方法:

T GetValue<T>();

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

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

我不确定原始类型是否可行,如何确定。


我认为,通过“基本类型” @ David.Chu.ca指非托管类型,即intfloat等不Int32Int64Single等等。虽然class表示ref类型“而不是类类型”被暗示非托管和托管基元之间的区别。
mireazma

Answers:


50

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

where C: struct

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


2
但不适用于可为空的字符串
David.Chu.ca,2009年

5
当然,它还允许您传递任何用户定义的结构类型,而不仅仅是原始类型。除了为所有内置基本类型定义重载之外,我不确定是否真的有办法。
马特·汉密尔顿,

1
问题是原始类型,而不是值类型。正如您在答案中提到的那样,字符串基元不是值类型,因此在这方面不起作用-它还将允许您传递不是基元的随机结构(如@MattHamilton所指出的那样)。
BrainSlugs83 '18

有了这个,如果我有一个方法可以处理n1 + n2n1和n2都属于类型的方法C,则会抛出错误:Operator '+' cannot be applied to operands of type 'C' and 'C'
Sisir19年

24

实际上,这在一定程度上完成了这项工作:

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

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


15

这是您要查找的内容:

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

该死的!我讨厌有人殴打我。好的BFree!
约书亚·贝尔登

1
原始但可为空的类型的字符串如何
David.Chu.ca

4
@David:字符串不是原始类型。在某些情况下,它是一种引用类型,被视为原始类型。
塞缪尔

但是没有办法强制转换动态检索的对象来满足该struct要求,是吗?
Nyerguds

1
字符串是原始类型,但不是结构/值类型。
BrainSlugs83 '18

11

没有通用约束可以完全匹配该组事物。您实际上想做什么?例如,您可以通过运行时检查来解决它,例如静态ctor(对于泛型类型-对于泛型方法而言并不容易)...

然而; 多数情况下,这是因为人们想要以下一种:

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


7

您实际上在尝试使用该方法做什么?可能是您实际上需要C来实现IComparable或其他接口。在这种情况下,您需要

T GetObject<T> where T: IComparable
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.