没有为“System.Int32”和“System.Double”类型定义二进制运算符“乘数”。 [英] The binary operator Multiply is not defined for the types 'System.Int32' and 'System.Double'.

查看:731
本文介绍了没有为“System.Int32”和“System.Double”类型定义二进制运算符“乘数”。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  var left = Expression.Constant(25d); 
var right = Expression.Constant(20);

//抛出一个InvalidOperationException!
var multiplyExpression = Expression.Multiply(left,right);

var multiply = 25d * 20;
Debug.WriteLine(multiply.ToString()); //正常工作

我不会使用 Expression.Convert 因为我无法确切地确定哪个表达式应该被转换。

解决方案

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

  private static void访问(ref表达式left,ref表达式右)
{
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);
}


Why the following code throws an exception at runtime, whereas doing it in the traditional way compiles without problem?

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!

I won't use Expression.Convert since I can't determine exactly which expression should be converted.

解决方案

Well, I figured out how to solve the problem using TypeCode enumeration to determine which node would have higher type precision, then convert the latter node's type to the former's type, and vice versa:

  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);
  }

这篇关于没有为“System.Int32”和“System.Double”类型定义二进制运算符“乘数”。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆