49

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

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

  • 字符串比较
    () => "a" == "b"变成了(我明白为什么VB.NetExpression.Equals("a", "b")
    Function() "a" = "b"Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    这里使用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# 不需要的某些情况下会生成方法调用,因此我需要拦截它们并以不同方式处理它们。

4

2 回答 2

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# 中的运算符相同。

于 2013-05-05T08:37:49.447 回答
2

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

于 2013-05-10T14:06:42.660 回答