我有一个处理表达式树的库 . 该库需要与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)
我的图书馆处理所有这些差异,但 are there more differences I need to look out for?
Edit 我的代码所做的一些解释 .
我使用的系统有一个过滤器,您可以像这样指定文档:
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#不需要拦截它们并以不同的方式处理它们 .
2 回答
/
除法运算符在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,选项explicite on ...选项全部打开),它将像C#一样工作 .