Подтвердить что ты не робот

Различия дерева выражений между С# и VB.Net

У меня есть библиотека, работающая над деревьями выражений. Библиотеке необходимо работать как с С#, так и с 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 генерирует вызовы методов в некоторых случаях, когда С# мне не нужно перехватывать их и обрабатывать их по-разному.

4b9b3361

Ответ 1

Оператор разделения / работает по-разному в С# и VB. В С# он адаптируется к используемым типам данных, в то время как VB всегда преобразует операнды в значения с плавающей запятой:

() => 1 / 2 становится Expression.Divide(1, 2)
Function() 1 / 2 становится Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))

В VB вам нужно будет использовать оператор \ для целочисленного деления и / для деления с плавающей запятой, чтобы получить то же самое, что и оператор / в С#.

Ответ 2

Мне пришлось работать с С# и VB.Net, часто связанными с моим проектом и большинством различий, которые я видел, когда VB.Net находится в небезопасном режиме. т.е. если мы создадим типы VB.Net(Option strict on, option explicite on... option all on), он будет работать как С#.