c#和VB.Net表达式树的区别

本文关键字:区别 表达式 Net VB | 更新日期: 2023-09-27 18:09:56

我有一个关于表达式树的库。该库需要与c#和VB一起工作。净

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

  • 字符串比较
    () => "a" == "b"变为Expression.Equals("a", "b")
    Function() "a" = "b"变为Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (我理解为什么VB。

  • 字符串连接
    () => "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表达式树的区别

/除法运算符在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#中的/运算符相同的结果。

我必须使用c#和VB。Net经常与我的项目相关,而我在使用VB时看到的大部分差异。Net处于不安全模式。如果我们制作VB的话。. Net类型安全(Option strict on, Option explicit on…)