VB コンパイラは自動的にラムダをLambdaExpression
同等のものに変換します (例: in Dim a As LambdaExpression = Function(x) x.Length
)。最近まで、この機能はラムダにのみ適用されると思っていましたが、メソッド呼び出しの結果を引数としてメソッドに渡そうとすると、同じ動作をすることがわかりました。コンパイラは、呼び出しを行うMethodCallExpression
代わりに、私の呼び出しを a に変換しました!
Dim myQuery = From x In DataSource.Items
Group By x.Key Into g = Group
Select New With {
.Key = Key,
.RedItems = g.Sum(ItemsOfColor(Colors.Red))
}
Private Function ItemsOfColor(color As Integer) As Expression(Of Func(Of Item, Integer))
Return Function(item) If(item.Color = color, 1, 0)
End Function
RedItems
私が期待したように、呼び出しの結果を持つではなく、引数としてMethodCallExpression
呼び出すItemsOfColor
が含まれています。Colors.Red
LambdaExpression
ItemsOfColor
質問: なぜコンパイラはこれが私が望む動作であると想定するのですか? また、それをオフにする方法はありますか?
注: これは、LINQ のコンパイル方法とその副作用をゆっくりと理解するのに役立つシリーズの 3 番目の質問です。パート1と2。