タイトル通りなのだが、VB.NET では下記のようなコードがコンパイル&実行可能。
「厳密でないデリゲート変換」というもので、ラムダ式が導入された時 (Visual Studio 2008) からあった模様。
「Option Strict On」でも適用されるため、「タイプセーフ?なにそれ?おいしいの?」のような機能・・・
前の投稿とかぶるが、これを無効化する Option はあった方がいい。
ちなみに、自分がやってしまったバグ
Sub と Function を間違えたのだが、まったく意味が違ってくる。
代入と比較の記号が同じであるため、コンパイルが通り、テストするまで気付けなかった。
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 件のコメント:
コメントを投稿