.NET 7泛型数学中,是否有更优方式实例化非0/1常量?
.NET 7泛型数学中构造非0/1常量的更优方式
我在试验.NET 7的泛型数学特性时,遇到了一个问题:如何更优雅地表示非0或1的泛型数值常量。比如下面的数字根计算函数里,我只能靠多次叠加T.One来凑出9,这种写法不仅繁琐,可读性也差:
public static T DigitalRoot<T>(T value) where T : IBinaryInteger<T> { var x = T.Abs(value: value); var y = T.Min(x: x, y: T.One); var z = (T.One + T.One + T.One + T.One + T.One + T.One + T.One + T.One + T.One); return (y + ((x - y) % z)); }
更优的解决方案
因为IBinaryInteger<T>继承了INumberBase<T>接口,该接口提供了直接将数值常量转换为泛型类型的方法,完全可以替代手动叠加的方式:
- 使用
T.CreateChecked(9):这是最推荐的方式,它能直接将int类型的9安全转换为泛型T类型,兼顾简洁性和性能 - 也可以用
T.Parse("9"),但字符串解析的效率不如直接数值转换,不推荐在性能敏感场景使用
修改后的代码如下:
public static T DigitalRoot<T>(T value) where T : IBinaryInteger<T> { var x = T.Abs(value); var y = T.Min(x, T.One); var z = T.CreateChecked(9); return (y + ((x - y) % z)); }
这样代码的可读性和简洁性都大幅提升,同时完全符合泛型数学的类型约束要求。
内容的提问来源于stack exchange,提问作者Kittoes0124
相关产品推荐
相关产品推荐

