我有一个带有泛型类型的方法:
T GetValue<T>();
我希望将T限制为原始类型,例如int、string和float,但不包括类类型。我知道可以像这样为类类型定义泛型:
C GetObject<C>() where C: class;
我不确定原始类型是否可以实现,如果可以的话,该如何实现。
我有一个带有泛型类型的方法:
T GetValue<T>();
我希望将T限制为原始类型,例如int、string和float,但不包括类类型。我知道可以像这样为类类型定义泛型:
C GetObject<C>() where C: class;
我不确定原始类型是否可以实现,如果可以的话,该如何实现。
where C: struct
你也提到了字符串。不幸的是,由于它们不是值类型,所以字符串是不允许的。
n1 + n2
,其中n1和n2都是类型为C
的变量,那么它会抛出错误:运算符'+'不能应用于类型为'C'和'C'的操作数
。 - Sisir实际上这个可以在一定程度上完成任务:
public T Object<T>() where T :
struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
要限制为数字类型,您可以使用以下示例为ValueType类定义的一些有用提示。
T GetObject<T>() where T : struct;
你在方法中实际上想要做什么?也许你需要使用C来实现IComparable或其他接口。如果是这样,你需要像下面这样:
T GetObject<T> where T: IComparable
我有同样的需求,希望创建一个方法,该方法应检索一个列表,其中T应为原始类型,如int、double、decimal等。
根据Microsoft文档: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/unmanaged-types
看起来正确的方法是使用
where T : unmanaged
引用:
如果类型是以下任何类型,则该类型是未管理类型:
sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool 任何枚举类型 任何指针类型 仅包含未管理类型字段的任何用户定义的结构类型,并且在 C# 7.3 及更早版本中,它不是构造类型(即至少包括一个类型参数的类型)
另外重要引用:
从 C# 7.3 开始,您可以使用未管理约束来指定类型参数是非指针、非可空未管理类型。
从 C# 8.0 开始,仅包含未管理类型字段的构造结构类型也是未管理类型...
unmanaged, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
等方式进行限制。我希望原始类型实际上能够实现一些允许唯一识别它们的东西(例如 IPrimitive
,其他类型无法实现)... - Rayunmanaged
不包含 string
类型,只需要为 string
添加一个重载。 - Mr. Squirrel.Downyunmanaged
不包含 string
类型,只需要为 string
添加一个重载。 - undefinedwhere C: unmanaged
int
,float
等,而不是Int32
,Int64
,Single
等。虽然class
表示引用类型,“但不是类类型”表明了未经管理和经管理的基元之间的区别。 - mireazma