3

我想对Expression.Add两种数据类型求和,这可能是 a double和 an int(或任何其他不匹配的对),如下所示:

var pLeft = Expression.Parameter(typeof(int), "left");
var pRight = Expression.Parameter(typeof(double), "right");

var addition = Expression.Add(pLeft, pRight);
var lambda = Expression.Lambda<Func<int, double, double>>(addition, pLeft, pRight).Compile();

var res = method(1, 0.5);

然而,我很快被告知:

The binary operator Add is not defined for the types 'System.Int32' and 'System.Double'.

很明显,+并不是为每对可能的数字都定义了运算符,但是当我编写类似var x = 1 + 0.5. 有没有一种方法可以使用表达式来模拟这种转换,或者有没有一种方法可以使用表达式来对这些类型求和?

4

1 回答 1

4

用于Expression.Convert将参数之一转换为相反参数的类型。

表达式树对隐式转换应该如何工作没有“意见”,因为它们不是特定于语言的。例如,C# 的隐式转换规则与 VB.NET 不同。表达式树采取中立立场,需要显式转换。

例如,面向性能的语言可能决定将 double 隐式转换为 int,因为默认情况下它更喜欢性能。在这种情况下,C# 更喜欢精确。表达式树一般不能决定这个问题。

于 2012-06-23T17:21:55.627 回答