如何为自定义类型BigFloat实现INumberBase的TryConvertToTruncating方法?
实现INumberBase的TryConvertToTruncating方法
我正在为自定义数值类型BigFloat实现新版的INumberBase接口,其中需要实现的方法签名如下:
static bool INumberBase<BigFloat>.TryConvertToTruncating<TOther>(BigFloat value, out TOther result) where TOther : System.Numerics.INumberBase<TOther>
这个方法用于将BigFloat转换为float、double、int等其他数值类型,我已经有对应类型的转换函数,想知道如何实现该方法,我的思路伪代码如下:
static bool INumberBase<BigFloat>.TryConvertToTruncating<TOther>(BigFloat value, out TOther result) { if (result is float) { result = value.ToFloat(); return true; } if (result is double) { result = value.ToDouble(); return true; } if (result is int) { result = value.ToInt(); return true; } // 不支持转换时必须为out参数赋值 result = TOther.Zero; return false; }
修正后的实现方案
你的伪代码存在问题:result是out参数,在完成赋值前无法访问,直接用result is float会编译报错。正确的做法是通过泛型参数TOther的类型来判断,具体实现如下:
static bool INumberBase<BigFloat>.TryConvertToTruncating<TOther>(BigFloat value, out TOther result) where TOther : System.Numerics.INumberBase<TOther> { if (typeof(TOther) == typeof(float)) { // 先转object再转TOther,绕过泛型类型转换限制 result = (TOther)(object)value.ToFloat(); return true; } if (typeof(TOther) == typeof(double)) { result = (TOther)(object)value.ToDouble(); return true; } if (typeof(TOther) == typeof(int)) { result = (TOther)(object)value.ToInt(); return true; } // 不支持转换时必须为out参数赋值 result = TOther.Zero; return false; }
关键说明
- 通过
typeof(TOther)判断目标转换类型,因为泛型参数的类型在编译阶段确定,运行时可通过typeof获取准确类型 - 由于泛型类型转换的限制,需要先将转换后的数值转为
object,再强制转为TOther,对于已知的数值类型,这种转换是安全的 - 必须保证所有代码路径都为
result赋值,转换失败时赋值为TOther.Zero并返回false,符合接口要求
内容的提问来源于stack exchange,提问作者kaba
相关产品推荐
相关产品推荐

