没有为类型'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
,因为我不能确切地确定应该转换哪个表达式
好了,我想出了如何使用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.Int32
和System.Double
作为参数的Expression.Multiply
方法。
*
将工作,因为它是较低的级别,你的值将自动类型转换。
var left = Expression.Constant(25d);
var right = Expression.Constant((double)20);
var multiplyExpression = Expression.Multiply(left, right); // works