F# Can';不能让运算符重载处理Linq表达式树

F# Can';不能让运算符重载处理Linq表达式树,f#,operator-overloading,expression-trees,F#,Operator Overloading,Expression Trees,我正在从F#创建Linq表达式树,它对我拥有的自定义数据类型进行操作。该类型是一个非常简单的判别并集,它重载了常用的算术运算符。但由于某些原因,我无法创建算术linq表达式节点,因为它无法找到正确的重载。事情是这样的,我发誓不久前我就让它工作了,但我不知道是什么改变了它 我将附上一个小的代码示例来说明这个问题。下面的数据类型重载了加法运算符。使用重载操作符的效果非常好,但是当我尝试使用expression.Add(lhs,rhs)创建一个加法表达式树节点时,系统抛出一个异常,抱怨无法找到Add操

我正在从F#创建Linq表达式树,它对我拥有的自定义数据类型进行操作。该类型是一个非常简单的判别并集,它重载了常用的算术运算符。但由于某些原因,我无法创建算术linq表达式节点,因为它无法找到正确的重载。事情是这样的,我发誓不久前我就让它工作了,但我不知道是什么改变了它

我将附上一个小的代码示例来说明这个问题。下面的数据类型重载了加法运算符。使用重载操作符的效果非常好,但是当我尝试使用expression.Add(lhs,rhs)创建一个加法表达式树节点时,系统抛出一个异常,抱怨无法找到Add操作的重载

有人知道我做错了什么吗

谢谢,, 里卡德


一种解决方案是显式地键入表达式操作数(为它们指定静态类型
DataType.DataCarrier
,而不是它们的运行时类型
DataType.DataCarrier.ScalarCarrier
):

主模块=
让createAddOp(lhs:DataType.DataCarrier)(rhs:DataType.DataCarrier)=
设clhs=表达式常数(lhs,typeof)
设crhs=表达式常数(rhs,typeof)
表达式.添加(clhs,crhs)
另一个选项是显式传递加法运算符以使用:

module Main =
    let createAddOp (lhs:DataType.DataCarrier) (rhs:DataType.DataCarrier) =
        let clhs = Expression.Constant(lhs)
        let crhs = Expression.Constant(rhs)
        Expression.Add(clhs, crhs, typeof<DataType.DataCarrier>.GetMethod("op_Addition"))
主模块=
让createAddOp(lhs:DataType.DataCarrier)(rhs:DataType.DataCarrier)=
设clhs=表达式常数(lhs)
设crhs=表达式常数(rhs)
Expression.Add(clhs、crhs、typeof.GetMethod(“op_Addition”))

但是,我很惊讶您的原始代码不起作用。这似乎限制了表达式树如何查找相关的加法运算符(也就是说,Linq似乎只在运行时类型的操作数上查找加法运算符)。

太棒了,我真的认为没有解决方法。你给我省了很多压力+1我认为这在10月F#的CTP之前是可行的。我要做一些测试。
module Main =
    let createAddOp (lhs:DataType.DataCarrier) (rhs:DataType.DataCarrier) =
        let clhs = Expression.Constant(lhs, typeof<DataType.DataCarrier>)
        let crhs = Expression.Constant(rhs, typeof<DataType.DataCarrier>)
        Expression.Add(clhs, crhs)
module Main =
    let createAddOp (lhs:DataType.DataCarrier) (rhs:DataType.DataCarrier) =
        let clhs = Expression.Constant(lhs)
        let crhs = Expression.Constant(rhs)
        Expression.Add(clhs, crhs, typeof<DataType.DataCarrier>.GetMethod("op_Addition"))