泛型数学中如何将INumber转换为具体类型(int/double等)
泛型数学中如何将INumber转换为具体类型(int/double等)
嘿,这个问题我之前在写.NET泛型数学代码时也碰到过!直接用(int)val强制转换肯定行不通——编译器没法确定泛型参数T的具体类型,不过咱们可以用INumber体系自带的专门转换方法来解决,下面给你两种常用的靠谱方案:
安全转换(溢出抛异常):用
int.CreateChecked(val)方法,它会在转换时如果数值超出int的范围,直接抛出OverflowException,适合需要严格校验数据准确性的场景:static int DoSomething<T>(T val) where T : INumber<T> { // 转换溢出时会抛出异常,避免错误数据流入后续逻辑 return int.CreateChecked(val); }截断转换(不抛异常):如果不需要溢出校验,只想直接截断多余部分(比如浮点数转int时丢掉小数位),就用
int.CreateTruncating(val):static int DoSomething<T>(T val) where T : INumber<T> { // 直接截断超出范围的部分,不会抛出异常,适合容忍精度损失的场景 return int.CreateTruncating(val); }
要是你需要转换到其他具体数值类型(比如double),逻辑也是完全一致的——把int换成对应的类型就行,比如double.CreateChecked(val)或者double.CreateTruncating(val)。
这些方法是.NET 7及以后版本泛型数学API特意提供的,完美适配INumber
备注:内容来源于stack exchange,提问作者Guru Stron
相关产品推荐
相关产品推荐

