将泛型类型参数约束为数字类型

本文关键字:数字 类型 参数约束 泛型类型 | 更新日期: 2023-09-27 18:15:06

我正在定义一个泛型类型:

public class Point<T> where T : IConvertible, IComparable

我真正想做的是将T约束为数值类型(int型或浮点型之一)。CLR中没有数字。这里是否有一个接口或接口集合可用于将类型约束为一个盒装数字类?

将泛型类型参数约束为数字类型

遗憾的是,没有。这是一个长期以来一直被高度要求的功能。

现在,最好的选择可能是使用:

where T : struct, IConvertible, IComparable<T>

(struct约束防止使用字符串…)

但是,这仍然允许使用任何实现适当约束的用户定义的值类型。

where T: struct将约束它为一个值类型

一种不太舒服的方法是检查构造函数中的有效类型并抛出异常。它可以工作,但它不是"编译器安全的",并且会产生运行时错误。: - (

不,你不能这么做。您可以选择在T:struct,IConvertible,IFormattable,IComparable中将其限制为所有可bit的数字类型和枚举,但是即使您做了限制,您仍然不能在T上使用操作符,因为操作符都是静态的。

point.X-point.Y

将是非法的,因为泛型不知道静态成员。