C#泛型数学中如何生成适配泛型类型的常量值?
更优雅的实现方式
针对你的泛型Fade函数,有几种更简洁的实现方案,无需额外定义完整的GenericValues<T>静态类:
方法一:使用IFloatingPoint<T>的数值创建方法
IFloatingPoint<T>接口原生提供了CreateChecked、CreateSaturating、CreateTruncating方法,可直接从整数创建对应泛型浮点类型的实例,这是最直接的解决方案:
private static T Fade<T>(T t) where T : IFloatingPoint<T> { var six = T.CreateChecked(6); var fifteen = T.CreateChecked(15); var ten = T.CreateChecked(10); return t * t * t * (t * (t * six - fifteen) + ten); }
若无需溢出检查,可改用CreateTruncating,性能会略有提升。
方法二:内联推导常量
如果不想依赖Create系列方法,也可以通过T.One直接推导所需常量,将定义内联到函数中,避免额外类的创建,适合仅在单个函数中使用这些常量的场景:
private static T Fade<T>(T t) where T : IFloatingPoint<T> { var five = T.One + T.One + T.One + T.One + T.One; var six = five + T.One; var ten = five + five; var fifteen = five + five + five; return t * t * t * (t * (t * six - fifteen) + ten); }
方法三:精简版静态常量类
如果多个函数都需要复用这些泛型数值,可以将静态类简化为仅定义所需常量,省去冗余的中间值推导:
private static class GenericMathConstants<T> where T : IFloatingPoint<T> { public static readonly T Six = T.CreateChecked(6); public static readonly T Ten = T.CreateChecked(10); public static readonly T Fifteen = T.CreateChecked(15); }
之后在函数中直接引用即可,既保留了常量复用的优势,又比原实现更简洁。
内容的提问来源于stack exchange,提问作者Rick de Water
相关产品推荐
相关产品推荐

