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。
GenericなBSearchクラスを作ろうとして挫折。型パラメータの扱いがわからず。she know!
いやもうホント、SHE KNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWW!!!!!!って叫んで盗んだバイクで東尋坊に向かって走り出す寸前でした。免許ないけど。
で、帰宅して食事とってシャワー浴びてから再度挑戦。そしたらわかりました。原因は・・・
Option Strict Offによる暗黙の型変換でした!!!
orz
ま、Option Strict Onにしたら普通にSyntaxエラー出て、解決しました。よかった。久々に日記も書けたしなw