【发布时间】:2020-09-28 22:11:26
【问题描述】:
我想构建以下表达式:
myObj.Id == null
myObj.Id 是一个不可为空的 int。我知道如果这个表达式是按字面计算的,那么结果总是错误的,但我需要构建这个表达式,因为表达式访问者稍后会检查它并用它做一些事情。
完全可以在您的代码中逐字编写此表达式,但是当我尝试使用以下工厂方法动态构建它时:
Expression.Equal(left: /* myObj.Id */, right: /* anotherId */);
我得到以下异常:
没有为类型“System.Int32”和“System.Object”定义二元运算符 Equal。
这没有意义,因为在 C# 中可以写出完全相同的表达式。
如何生成该表达式? <int> == null?
【问题讨论】:
-
@HansPassant 我在您发表评论后编辑了问题,您能再看一下吗?我想建立
<int> == null。我尝试将liftToNull参数设置为true,但并没有解决问题。 -
“这没有意义,因为可以按字面意思写出完全相同的表达式” -- 怎么样?在您的示例中,
anotherId是什么?如果它不是object类型的东西,那与您的需求有什么关系?如果它是object类型的东西,是什么让你这么说,例如表达式i == o其中i是int和o是对象会编译吗?它不会。 也许出于表达式的目的,您想要从值类型转换为可空类型(例如Nullable<T>或装箱int),但没有更多上下文,不可能知道你需要什么。 -
这感觉有点像XY problem。
-
不管怎样,当您尝试学习如何使用表达式 API 时,首先让编译器为您构建表达式通常会很有帮助。例如,编译并执行这段代码:
Expression<Func<int, bool>> ex = i => i == null。然后进入调试器并检查ex的值,看看编译器做了什么。然后你就做同样的事情。提示:编译器将int提升为Nullable<int>akaint?
标签: c# .net expression