(1) 代入式の左辺が Integer 型の変数やプロパティで、右辺が文字列 "HH:mm" の時 Dim jikan As Integer = "HH:mm" 'Dim jikan As Integer = DateTimePicker1.Value.Hour.ToString("HH:mm")
(2) Integer 型の引数を受け取るメソッドに、"HH:mm" という文字列引数を渡してた時 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Test("HH:mm") End Sub Sub Test(hhmm As Integer) End Sub
> (1) 代入式の左辺が Integer 型の変数やプロパティで、右辺が文字列 "HH:mm" の時 > Dim jikan As Integer = "HH:mm" > 'Dim jikan As Integer = DateTimePicker1.Value.Hour.ToString("HH:mm") > > (2) Integer 型の引数を受け取るメソッドに、"HH:mm" という文字列引数を渡してた時 > Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click > Test("HH:mm") > End Sub > Sub Test(hhmm As Integer) > End Sub
今回の場合、 Dim s1 As String = DateTimePicker1.Value.ToString("HH:mm") と書くべきところを、間違えて、 Dim s2 As String = DateTimePicker1.ToString("HH:mm") と書いていたわけですよね。
DateTimePicker の ToString メソッドは、引数を持つオーバーロードが 無いにも関わらず、BC30516 が発生しなかった理由は、 Dim s As String = DateTimePicker1.ToString("HH:mm") というコードが、 Dim s As String = CStr(DateTimePicker1.ToString().Chars(CInt("HH:mm"))) の意味で、コンパイラに解釈されていたためです。
Option Strict Off の弊害ですね…。 Option Strict On でコンパイルが通るコードを目指すことをお奨めします。 そうすれば、実行前にコーディングミスに気付けるはず!
---- まず、元のコードはこれでした。 s = DateTimePicker1.ToString("HH:mm")
しかし、ToString には引数を受け取るオーバーロードが無いため、 「引数の無いメソッド呼び出しは括弧を省略できる」というルールにより、 s = DateTimePicker1.ToString()("HH:mm") の意味に解釈されます。
そしてこれは要するに、 s = DateTimePicker1.ToString().Chars("HH:mm") の呼び出しを意味します。