C#和VB.Net之间的表达式树的区别是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我有一个库工作表达树。该库需要与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();

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

Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...);
filter.Apply(document);

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

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

提问于
用户回答回答于

我不得不使用经常与我的项目相关的C#和VB.Net,以及当VB.Net处于不安全模式时我看到的大部分差异。即,如果我们使VB.Net类型安全(Option strict on,option explicite on ...选项全部打开),它将像C#一样工作。

用户回答回答于

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

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

在VB中,需要使用\运算符进行整数除法和/浮点除法以得到与/C#中的运算符相同的值。

扫码关注云+社区