C# 11泛型数学中如何使用数值字面量与数学常量?
C# 11泛型数学里用数值字面量和常量的正确姿势
整数字面量转泛型T的方法
像示例里的2这种int字面量,直接用肯定行不通——它没法隐式转换为泛型参数T。你可以借助INumber<T>接口提供的静态创建方法:
T.CreateChecked(2):转换溢出时直接抛出异常,适合需要严格校验的场景T.CreateTruncating(2):溢出时自动截断数值,不会抛出异常- 要是小整数,也可以用
T.One + T.One来凑出目标值,写法更直观
示例代码调整如下:
public T Circumference<T>(T radius) where T : INumber<T> { var two = T.CreateChecked(2); return two * radius; }
数学常量(比如π)的正确用法
如果是处理浮点类型的泛型,别再用Math.PI了——把泛型约束换成IFloatingPoint<T>就行。这个接口自带了T.PI、T.E这类静态常量,直接调用就对了。
结合两者的可运行完整代码:
public T Circumference<T>(T radius) where T : IFloatingPoint<T> { var two = T.CreateChecked(2); return two * T.PI * radius; }
额外补充
INumber<T>是所有数值类型的通用基接口,IFloatingPoint<T>继承自它,专门为浮点类型提供了更多数学相关API- 其他常用数学常量比如自然常数
e,直接使用T.E即可 - 字面量转换的几个方法里,
CreateChecked是最安全的,能第一时间发现溢出问题;如果不需要溢出校验,也可以用CreateSaturating或CreateTruncating
内容的提问来源于stack exchange,提问作者paulmattern
相关产品推荐
相关产品推荐

