我正在定义一个通用类型:
public class Point<T> where T : IConvertible, IComparable
我真正想做的是将T限制为数字类型(int或浮点之一。)CLR中没有INumeric。是否有接口或接口集合可用于将类型约束为其中一个盒装数字类?
答案 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
由于仿制药不了解静态成员,因此是非法的。