这里有一个类似的问题:
...但这不是我现在要问的。
我正在创建一个简单的表达式解析器,将lambda表达式转换为SQL WHERE子句。 我像这样调用它:
GetEntities<MyEntity>(e => e.MyProperty == MyValue)
C#会根据我的预期创建表达式,其中表达式是一个BinaryExpression
,其左侧是一个MemberExpression
,右侧是一个ConstantExpression
,如下所示:
$e.MyProperty == MyValue
然而,VB.NET 调用 CompareString
,并将 MyProperty
和 MyValue
作为参数传递,并检查返回结果是否为 0。当以这种方式调用时:
GetEntities(Of MyEntity)(Function(e) e.MyProperty = MyValue)
...它会生成如下表达式:
.Call Microsoft.VisualBasic.CompilerServices.Operators.CompareString(
$e.MyProperty, MyValue, False) == 0
显然,这与我的表达式解析器不太兼容,因此我现在必须遍历方法表达式以获取传递给它的值等等。
是否有一种方法可以强制 VB.NET 以 所有情况 生成与 C# 相同的表达式树?我不想写大量代码来处理这些重大差异。
=
与C#中的==
不同(如空值处理和大小写敏感性)。您是否希望您的walker在VB中使用C#行为?这会不会使VB用户困惑? - adrianma == b
和a = b
的语义是相同的。所有这些表达式的工作都是在幕后完成的,因此开发人员只需要明白他们正在进行相等性检查。 - oscilatingcretin