C#和VB.Net之间的表达式树差异

adr*_*anm 49 c# vb.net expression-trees

我有一个处理表达式树的库.该库需要与C#和VB.Net一起使用

注意到语言之间关于如何构造表达式树的一些差异

  • 字符串比较
    () => "a" == "b"Expression.Equals("a", "b")
    Function() "a" = "b"Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (我明白为什么VB.Net使用此处CompareString)

  • 字符串连接
    () => "a" + "b"变得Expression.Add("a", "b", String.Concat)
    Function() "a" & "b"变得Expression.Call(String.Concat, "a", "b")

  • 优化?
    () => !(1 == 2)变得Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2)变得Expression.NotEqual(1, 2)

我的图书馆处理所有这些差异,但是我需要注意更多的差异吗?

编辑 我的代码所做的一些解释.

我使用的系统有一个过滤器,您可以像这样指定文档:

var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();
Run Code Online (Sandbox Code Playgroud)

为了更容易使用过滤器,我的代码允许您将过滤器指定为Expression<Func<bool>>lambda.

Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...);
filter.Apply(document);
Run Code Online (Sandbox Code Playgroud)

然后我的代码迭代表达式树并调用上面指定的文档过滤器方法.过滤器不支持您可以放入lambda的所有内容.方法调用是最明显的.

由于VB.Net在某些情况下生成方法调用,而C#不需要拦截它们并以不同的方式处理它们.

Guf*_*ffa 6

/除法运算符的工作方式不同在C#和VB.在C#中它适应所使用的数据类型,而VB总是将操作数转换为浮点值:

() => 1 / 2变得Expression.Divide(1, 2)
Function() 1 / 2变得Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))

在VB中,您需要使用\运算符进行整数除法,并/使用浮点除法与/C#中的运算符相同.