【问题标题】:How to define generic type limit to primitive types?如何定义基本类型的泛型类型限制?
【发布时间】:2009-04-30 03:42:55
【问题描述】:

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

T GetValue<T>();

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

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

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

【问题讨论】:

  • 我认为“原始类型”@David.Chu.ca 表示非托管类型,即intfloat 等,而不是Int32Int64Single 等。 . 虽然class 表示一个 ref 类型,但“但不是类类型”是在暗示非托管和托管原语之间的区别。

标签: c# .net generics type-constraints


【解决方案1】:

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

where C: struct

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

【讨论】:

  • 但不适用于可为空的字符串
  • 当然,它允许您传递任何用户定义的结构类型,而不仅仅是原始类型。除了为所有内置原始类型定义重载之外,我不确定是否有其他方法。
  • 问题是针对原语,而不是值类型。正如您在回答中提到的,字符串原语不是值类型,因此在这方面它不起作用——它还允许您传递不是原语的随机结构(正如@MattHamilton 指出的那样)。
  • 如果我有一个方法可以执行 n1 + n2 其中 n1 和 n2 都是 C 类型,那么它会抛出错误:Operator '+' cannot be applied to operands of type 'C' and 'C'
【解决方案2】:

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

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

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

【讨论】:

  • 注意: 如果您使用它向数据库提供 ID 字段,和我一样,Guid 结构不支持IConvertible 接口,您可能需要删除它。
【解决方案3】:

这就是您要查找的内容:

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

【讨论】:

  • 该死!我讨厌有人打我一拳。不错的免费!
  • 原始但可空类型的字符串怎么样
  • @David:字符串不是原始类型。它是一种引用类型,在某些情况下被视为原始类型。
  • 但是没有办法强制转换动态检索的对象来满足struct 的要求,是吗?
  • String 是原始类型,但不是结构/值类型。
【解决方案4】:

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

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

  • 能够检查项目是否相等:在这种情况下使用EqualityComparer&lt;T&gt;.Default
  • 能够比较/排序项目:在这种情况下使用Comparer&lt;T&gt;.Default
  • 能够执行算术运算:在这种情况下使用MiscUtilgeneric operators 的支持
【解决方案5】:

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

T GetObject<T> where T: IComparable

【讨论】:

    【解决方案6】:

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

    where C: unmanaged
    

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 2020-03-22
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2019-12-28
      • 1970-01-01
      相关资源
      最近更新 更多