没有为类型'System.Int32'和& # 39;System.Double& # 39;

本文关键字:System 类型 Double Int32 | 更新日期: 2023-09-27 18:03:56

为什么下面的代码会在运行时抛出异常,而用传统的方式编译却没有问题?

var left = Expression.Constant(25d);
var right = Expression.Constant(20);
// Throws an InvalidOperationException!
var multiplyExpression = Expression.Multiply(left, right); 
var multiply = 25d * 20;
Debug.WriteLine(multiply.ToString()); // Works normally!

我不会使用Expression.Convert,因为我不能确切地确定应该转换哪个表达式

没有为类型'System.Int32'和& # 39;System.Double& # 39;

好了,我想出了如何使用TypeCode枚举来确定哪个节点具有更高的类型精度,然后将后一个节点的类型转换为前一个节点的类型,反之亦然:

  private static void Visit(ref Expression left, ref Expression right)
  {
     var leftTypeCode = Type.GetTypeCode(left.Type);
     var rightTypeCode = Type.GetTypeCode(right.Type);
     if (leftTypeCode == rightTypeCode)
         return;
     if (leftTypeCode > rightTypeCode)
        right = Expression.Convert(right, left.Type);
     else
        left = Expression.Convert(left, right.Type);
  }
var left = Expression.Constant(25d);
var right = Expression.Constant(20);
var multiplyExpression = Expression.Multiply(
    left, 
    Expression.Convert(right, left.Type)); 

或者,如果你不知道左边有更高的精度,并且你想总是以double的结果结束,你可以这样说:

Expression left = Expression.Constant(2);
Expression right = Expression.Constant(25.1);
left = Expression.Convert(left, typeof(double));
right = Expression.Convert(right, typeof(double));
var multiplyExpression = Expression.Multiply(left, right); 

标题中的错误信息是告诉你为什么有一个异常。

没有定义以System.Int32System.Double作为参数的Expression.Multiply方法。

*将工作,因为它是较低的级别,你的值将自动类型转换。

var left = Expression.Constant(25d);
var right = Expression.Constant((double)20);
var multiplyExpression = Expression.Multiply(left, right); // works
相关文章: