DOBON.NETプログラミング道掲示板

■35371 / 3階層)  時間変数(文字列)の扱い
□投稿者/ 魔界の仮面弁士 大御所(1534回)-(2023/02/09(Thu) 14:36:13)
  • アイコンNo35370に返信(ま〜さんの記事)
    >> = DateTimePicker1.Value.ToString("HH:mm")
    > ★これでした。Valueが必要でした。
    >>「BC30516 この引数の数を受け付ける 'ToString' がないため、オーバーロードの解決に失敗しました。」
    >>のコンパイルエラーになっているはずですが…?
    > 実行時にその行に来た時にエラーとなっていました

    あー…状況理解。

    今回の場合、
     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")
    の呼び出しを意味します。

    つまり ("HH:mm") 部分は、「ToString メソッドの引数」ではなく、
    「String 型の既定のプロパティ(いわゆるインデクサ)の引数」と
    解釈されていたわけです。

    しかし、String のインデクサに渡せる引数は Integer 値だけです。

    Option Strict On であれば、この時点でコンパイルエラー
     BC30512『Option Strict On では 'String' から 'Integer' への暗黙的な変換は許可されていません。』
    が発生するので、すぐに気づくことができますが、
    Option Strict Off では検出してもらえません。

    そのため、実行した時点でようやく、
     System.InvalidCastException:
     String "HH:mm" から型 'Integer' への変換は無効です。
    のエラーが発生していた…というわけです。


    Dim v1 = DateTimePicker1.ToString() 'v1 は String 型となる
    Dim v2 = DateTimePicker1.ToString()(0) 'v2 は Char 型となる
解決み!
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: 時間変数(文字列)の扱い /ま〜 →Re[4]: 時間変数(文字列)の扱い /ま〜
 
上記関連ツリー

Nomalアイコン 時間変数(文字列)の扱い / ま〜 (23/02/07(Tue) 20:11) #35368
Nomalアイコン Re[1]: 時間変数(文字列)の扱い / 魔界の仮面弁士 (23/02/07(Tue) 21:02) #35369
  └Nomalアイコン Re[2]: 時間変数(文字列)の扱い / ま〜 (23/02/09(Thu) 13:17) #35370 解決み!
    └Nomalアイコン 時間変数(文字列)の扱い / 魔界の仮面弁士 (23/02/09(Thu) 14:36) #35371 解決み! ←Now
      └Nomalアイコン Re[4]: 時間変数(文字列)の扱い / ま〜 (23/02/10(Fri) 15:52) #35375 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -