gpt4 book ai didi

c# 数学运算的泛型方法

转载 作者:行者123 更新时间:2023-11-30 22:13:45 27 4
gpt4 key购买 nike

我想创建一个执行基本数学运算的通用方法。例如。如果将 double 传递给该函数,它将返回 double

public static T Multiply<T> (T A, int B)
{
//some calculation here
return (T) A * B;
}

这对我不起作用。

编辑:我收到错误运算符“*”无法应用于类型“T”和“int”的操作数

但是我想知道是否有其他方法可以实现我的目标?

谢谢

最佳答案

您可以通过为特定类型构造和编译 LINQ 表达式来实现,如下所示:

private static IDictionary<Type,object> MultByType = new Dictionary<Type,object>();
public static T Multiply<T>(T a, int b) {
Func<T,int,T> mult;
object tmp;
if (!MultByType.TryGetValue(typeof (T), out tmp)) {
var lhs = Expression.Parameter(typeof(T));
var rhs = Expression.Parameter(typeof(int));
mult = (Func<T,int,T>) Expression.Lambda(
Expression.Multiply(lhs, Expression.Convert(rhs, typeof(T)))
, lhs
, rhs
).Compile();
MultByType.Add(typeof(T), mult);
} else {
mult = (Func<T,int,T>)tmp;
}
return mult(a, b);
}

为避免每次使用时都重新编译表达式,可以将其缓存在字典中。

请注意,这种方法有一定的局限性:

  • TT 的乘法预计会被定义,
  • 乘法的输出预计为 T,无需转换。对于小于 int 的类型,情况并非如此,
  • 类型必须支持从 int 的转换。

这些都不会在编译时检查。

关于c# 数学运算的泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875361/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com