我希望以下代码:
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#编译器似乎没有相同的行为 - 左移和右移操作符都不会导致编译器引入任何其他操作。
乳清是这个额外的操作介绍?
来自docs:
为了防止比结果更多的位移位,Visual Basic使用与
amount
的数据类型对应的大小掩码来屏蔽pattern
的值。这些值的二进制AND
用于移位量。