Я ожидаю, что следующий код:
Dim i = 7, j = 5
Dim expr As Expression(Of Func(Of Integer)) = Function() i << j
создаст дерево выражений LambdaExpression
с одной операцией между двумя переменными i
и j
.Вместо этого дерево выражений содержит дополнительную побитовую &
операцию против 31
, как можно увидеть в следующем DebugView:
.Lambda #Lambda1<System.Func`1[System.Int32]>() {
.Constant<_visualizerTests.VB.Module1+_Closure$__0-0>(_visualizerTests.VB.Module1+_Closure$__0-0).$VB$Local_i << (.Constant<_visualizerTests.VB.Module1+_Closure$__0-0>(_visualizerTests.VB.Module1+_Closure$__0-0).$VB$Local_j &
31)
}
или визуально :
Та же операция вводится, когда используется сдвиг вправо.
Компилятор C #, похоже, не имеет такого же поведения - ни сдвиг влево, ни вправооператоры -shift заставляют компилятор вводить какие-либо дополнительные операции.
Почему эта дополнительная операция введена?