如何实现INumber<T>与int的乘法运算?
如何实现泛型中TResult与int的乘法运算?
问题:如何实现最后一行中与int的乘法运算(
z * 2)?
以下是报错的原始代码:
public static TResult Test<TResult>() where TResult : INumber<TResult> { TResult x = TResult.AdditiveIdentity; TResult y = TResult.MultiplicativeIdentity; TResult z = x * y; TResult z2 = z * 2; // <--- 此处出现CS0019错误:“运算符 * 无法应用于类型为'TResult'和'int'的操作数” return z2; }
尝试过的方案及问题
有人建议添加IMultiplyOperators<TResult, int, TResult>接口约束,但会导致decimal类型无法兼容:
public static void Tester() { Test<decimal>(); // CS0315错误:类型decimal无法用作类型参数TResult……不存在装箱转换 }
目前采用的方案是注入乘法函数:
public static TResult Test<TResult>(Func<TResult, int, TResult> mul) where TResult : INumber<TResult> { TResult x = TResult.AdditiveIdentity; TResult y = TResult.MultiplicativeIdentity; TResult z = x * y; TResult z2 = mul(z, 2); return z2; }
更优解决方案:将int转换为TResult类型后相乘
问题核心是INumber<TResult>仅保证同类型乘法支持,未直接提供跨int的乘法能力。我们可以把int值转换为TResult类型,再执行同类型乘法,既不需要额外约束,又能兼容所有INumber<TResult>实现类(包括decimal)。
方式1:使用TResult.Create(.NET 7+推荐)
public static TResult Test<TResult>() where TResult : INumber<TResult> { TResult x = TResult.AdditiveIdentity; TResult y = TResult.MultiplicativeIdentity; TResult z = x * y; // 直接从int创建TResult实例 TResult factor = TResult.Create(2); TResult z2 = z * factor; return z2; }
方式2:使用Parse兼容旧版本
public static TResult Test<TResult>() where TResult : INumber<TResult> { TResult x = TResult.AdditiveIdentity; TResult y = TResult.MultiplicativeIdentity; TResult z = x * y; // 将int的2转换为TResult类型 TResult factor = TResult.Parse("2", null); TResult z2 = z * factor; return z2; }
方案优势说明
- 无需额外接口约束:避免了
decimal等类型不兼容IMultiplyOperators<TResult, int, TResult>的问题 - 调用更简洁:不需要调用方传入乘法逻辑,降低使用成本
- 兼容性全覆盖:支持
decimal、int、double等所有实现INumber<TResult>的数值类型
验证兼容性示例:
public static void Tester() { Test<decimal>(); // 正常运行 Test<int>(); // 正常运行 Test<double>(); // 正常运行 }
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

