2015年2月10日

VB.NET Action デリゲート型に Function ラムダ式を代入

タイトル通りなのだが、VB.NET では下記のようなコードがコンパイル&実行可能。

Module TestDelegate
    Sub Main()
        Dim act1 As Action = Function() True
        act1()

        ' 引数があるデリゲートも
        Dim act2 As Action(Of Integer) = Function(i) i + 1
        act2(0)
        ' ラムダ式の引数を省略可能
        act2 = Function() True
        act2(0)
        act2 = Sub() Console.WriteLine("void")
        act2(0)
    End Sub
End Module

'[実行結果]
'> void

「厳密でないデリゲート変換」というもので、ラムダ式が導入された時 (Visual Studio 2008) からあった模様。

「Option Strict On」でも適用されるため、「タイプセーフ?なにそれ?おいしいの?」のような機能・・・
前の投稿とかぶるが、これを無効化する Option はあった方がいい。

ちなみに、自分がやってしまったバグ

Module BugExample
    Sub Main()
        Dim elements As New List(Of Element)
        ' 中略
        elements.Where(適当な条件).ForEach(Function(elem) elem.Enabled = True)
    End Sub
End Module

Class Element
    Public Property Enabled As Boolean
    ' 以下略
End Class
※ ForEach は Interactive Extensions の拡張メソッド。
Sub と Function を間違えたのだが、まったく意味が違ってくる。
代入と比較の記号が同じであるため、コンパイルが通り、テストするまで気付けなかった。

0 件のコメント:

コメントを投稿