我期望下面的代码:
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)
}
或visually:
使用右移时会引入相同的操作。
C#编译器似乎没有相同的行为-左移和右移运算符都不会导致编译器引入任何其他操作。
为什么要引入此附加操作?
答案 0 :(得分:2)
来自docs:
为防止移位超出结果可容纳的位数,Visual Basic使用与
amount
的数据类型相对应的大小掩码来屏蔽pattern
的值。这些值的二进制AND
用于偏移量。