2018年以降の記事はGitHub Pagesに移行しました

VB6からVB.NETにソース移行すると特定のIf文でInvalidCastException

あらすじ

VB6の時、If (value = 1)のような条件式でvalueに数値・文字どちらが入ってきてもエラーになっていなかった。*1

しかし、VB.NETになりvalueに文字が入ってきた場合、InvalidCastExceptionが発生するようになった。どうも、VB6のときと評価の方法が変わっている模様…。

検証

Option Strict が Off の場合の比較は、実行時の型で比較方法が変わる。

比較対象 結果
どちらもString If (“a” = “b”) 文字列比較を行う
どちらも数値 If (1 = 3) Doubleに変換され数値比較を行う
数値とString If (1 = “1”)
If (1 = “a”)
文字列がDoubleに変換(※)され数値比較を行う。
文字列をDoubleに変換できない場合 InvalidCastException

(※)どうも、この部分がVB6のときと変わっている?

数値と文字(数値以外)の比較がダメなようなので、不本意ながらIf (value = "1")にしてその場を凌いだが…。
なお、Nothingは比較対象が数値なら0,文字列なら”“となる。

*1:結果は覚えていないけど、1以外は全てfalseになったような。