gpt4 book ai didi

c# - 重写的表达式调用运算符方法...但原始节点没有运算符方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:21 25 4
gpt4 key购买 nike

我正在尝试更改表达式树的一部分,其中将类型为 MyEnum 的属性 X 与某个值 x 进行比较:

$model.X == .Constant<MyEnum>(x)

我想修改树以替换比较,以将 Guid 类型的属性 Y 与值 y(将从 x 派生)进行比较。

$model.Y == .Constant<Guid>(y)

所以我从 ExpressionVisitor 继承并且我重写了 VisitMember 以用 Y 代替 X,并且我重写了 VisitConstant 以用 y 代替 x。

运行它会产生以下 InvalidOperationException:

System.InvalidOperationException : Rewritten expression calls operator method 'Boolean op_Equality(System.Guid, System.Guid)', but the original node had no operator method. If this is is intentional, override 'VisitBinary' and change it to allow this rewrite.

我的主要问题是:我必须在 VisitBinary 中做什么?我的问题是:为什么异常消息告诉原始节点没有运算符方法。我认为这是不正确的。它肯定没有 op_Equality(System.Guid, System.Guid),但我假设它有 MyEnum 类型的相等运算符。

最佳答案

我从名称中猜测 MyEnum 是某种 Enum 类型。

Enum 类型不需要运算符方法,因为 CIL 直接为它们处理相等比较(内置整数、浮点和 bool 类型也是如此)。

无法通过 BinaryExression.Update() 更改方法(它将在您的访问者中显式调用或隐式调用,因为您的访问者已经更改了左右表达式中的一个或两个,这是这种情况下的默认行为)你必须让 VisitBinary() 通过适当调用 Expression.Equal() 创建并返回一个新的 BinaryExpression

关于c# - 重写的表达式调用运算符方法...但原始节点没有运算符方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36426297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com