読者です 読者をやめる 読者になる 読者になる

GenericなClassの型パラメータの扱い(?)で、ちょっと罠にはまる

今日、夕方ちょっと二分探索してくれるGenericなClassが欲しくなったので作ったんですよ。型パラメータの与え方とか制約のつけ方とかGoogle先生に助けてもらいながら。で、こんなフィーリングのを作った。

Class BinarySearcher(Of T As {IComparable})
    Public Shared Function Search(ByVal Source As List(Of T), ByVal Target As T) As T
        Dim top As Integer = 0
        Dim bottom As Integer = Source.Count - 1
        Dim found As Boolean = False
        Dim checkTargetIndex As Integer
        Do Until found
            If top > bottom Then
                Return Nothing
            End If
            checkTargetIndex = CInt((top + bottom) / 2)
            If Source(checkTargetIndex).CompareTo(Target) = 0 Then
                found = True
                Continue Do
            End If
            If Source(checkTargetIndex).CompareTo(Target) > 0 Then
                bottom = checkTargetIndex - 1
                Continue Do
            End If
            top = checkTargetIndex + 1
        Loop
        Return Target
    End Function
End Class

まあ、これはいいんだけど、頭にはてなマークがいっぱい出たのがこれを呼び出すコード。

Module Module1
    Sub Main()
        Dim source As New List(Of String)
        For i As Integer = 1 To 20 Step 2
            source.Add(i.ToString())
            Console.Write("{0} ", i)
        Next
        Console.WriteLine()
        Console.WriteLine(BinarySearcher(Of String).Search(source, 0)) ' Syntaxエラーにならないいいいい??????
    End Sub
End Module

これがもうホントにわかんなくて。きっと二分探索するクラスの方の型パラメータの扱いがおかしいんだ!と思っていろいろ調べるけどわからんくて。んで、出てきたのがつぎのtweet

いやもうホント、SHE KNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWW!!!!!!って叫んで盗んだバイクで東尋坊に向かって走り出す寸前でした。免許ないけど。

で、帰宅して食事とってシャワー浴びてから再度挑戦。そしたらわかりました。原因は・・・

Option Strict Offによる暗黙の型変換でした!!!

orz

ま、Option Strict Onにしたら普通にSyntaxエラー出て、解決しました。よかった。久々に日記も書けたしなw