У меня есть библиотека, работающая над деревьями выражений. Библиотеке необходимо работать как с С#, так и с 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) 
Моя библиотека обрабатывает все эти различия, но есть ли больше различий, которые мне нужно искать?
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);
Затем мой код выполняет итерацию дерева выражений и вызывает методы фильтра документа, как указано выше. Фильтр не поддерживает все, что можно положить в лямбду. Вызов метода является наиболее очевидным.
Так как VB.Net генерирует вызовы методов в некоторых случаях, когда С# мне не нужно перехватывать их и обрабатывать их по-разному.