编译器通过位移操作将按位AND添加到表达式树中

问题描述 投票:2回答:1

我希望以下代码:

Dim i = 7, j = 5
Dim expr As Expression(Of Func(Of Integer)) = Function() i << j

通过两个变量LambdaExpressioni之间的单个操作来生成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#编译器似乎没有相同的行为 - 左移和右移操作符都不会导致编译器引入任何其他操作。

乳清是这个额外的操作介绍?

.net vb.net expression-trees
1个回答
2
投票

来自docs

为了防止比结果更多的位移位,Visual Basic使用与amount的数据类型对应的大小掩码来屏蔽pattern的值。这些值的二进制AND用于移位量。

© www.soinside.com 2019 - 2024. All rights reserved.