如何定义原始类型的泛型类型限制?

Dav*_*.ca 64 .net c# generics type-constraints

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

T GetValue<T>();
Run Code Online (Sandbox Code Playgroud)

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

C GetObject<C>() where C: class;
Run Code Online (Sandbox Code Playgroud)

我不确定原始类型是否可能以及如果可能.

BFr*_*ree 46

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

where C: struct
Run Code Online (Sandbox Code Playgroud)

你还提到了字符串.不幸的是,不允许字符串,因为它们不是值类型.

  • 但不适用于可为空的字符串 (3认同)
  • 当然,它允许您传递任何用户定义的结构类型,而不仅仅是原始类型.除了为所有内置基元类型定义重载之外,我不确定是否有办法. (3认同)
  • 问题是针对原语,而不是值类型。正如您在回答中提到的,字符串原语不是值类型,因此它在这方面不起作用——它还允许您传递不是原语的随机结构(如@MattHamilton 指出的那样)。 (2认同)

小智 18

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

public T Object<T>() where T :
   struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*den 15

这是你要找的东西:

T GetObject<T>() where T : struct;
Run Code Online (Sandbox Code Playgroud)

  • 原始但可为空类型的字符串怎么样 (4认同)
  • @David:string不是原始类型.它是一种引用类型,在某些情况下被视为基本类型. (3认同)
  • String 是原始类型,但不是结构/值类型。 (3认同)

Mar*_*ell 10

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

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

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


Dav*_*ing 7

你在这个方法中真正想做什么?可能实际上你需要C来实现IComparable或其他一些接口.在这种情况下你想要的东西

T GetObject<T> where T: IComparable
Run Code Online (Sandbox Code Playgroud)