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

时间:2011-11-16 18:52:04

标签: c# generics

我正在定义一个通用类型:

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

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

4 个答案:

答案 0 :(得分:11)

不幸的是,没有。这已经是highly requested feature很长一段时间了。

目前,最好的选择可能是:

where T : struct, IConvertible, IComparable<T>

(结构约束阻止字符串使用......)

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

答案 1 :(得分:1)

where T: struct会将其约束为值类型。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

不,你不能这样做。 您可以选择T:struct,IConvertible,IFormattable,IComparable将其限制为所有blittable数字类型和枚举的位置,但即使您执行了限制,您仍然无法在T上使用运算符,因为运算符都是静态的。

E.g。

point.X-point.Y

由于仿制药不了解静态成员,因此是非法的。