歴史の授業
VBバージョン1から3は厳しいでした。型の整合性チェックは実行時に行われましたが、より厳しいものでした。文字列を整数に代入すると、実行時エラーが発生します。整合性チェックが実行時にのみ行われた理由はわかりません - コンパイル時のチェックは実装が難しいと思います。
VBバージョン4では、文字列を整数に割り当てるとエラーは発生しませんが、暗黙的に文字列値が整数に変換されるように言語が変更されました。たとえば、文字列が"0"
または""
の場合、0
に変換されます。文字列が含まれている場合、たとえば"1E40"
とすると、オーバーフローエラーが発生します。多くのVBプログラマ(erm、私を含む)はこの変更を嫌って、それを悪の型強制と呼んだ。例えば。 Karl Petersonの指導者であるarticleを参照してください。
アーキテクチャ上のアプローチは、「実行時に型を推測で変換しようとすると、不可能な場合にのみエラーを発生させる」というものでした。つまり、のチェックは実行時にとなります。原則として、コンパイラは、オブジェクト型がプライベートで他のクラスでは実装されていないケースを検出し、コンパイル時にそれをチェックすることができますが、コンパイラ開発者の優先順位ではないと思います。開発者は、実行時にいくつかの割り当てがチェックされた理由と、コンパイル時に他のものがチェックされた理由を理解することが紛らわしいかもしれません。
VB.Netでは、既定の動作は従来のコードを簡単にアップグレードできるようにVB6と同じです。 Option Strict On
は、コンパイル時にチェックが行われるようにVB.Netで優先されます。コンパイル時のチェックは、間違いを早期に発見してしまうので便利です。
非常に面白い答えです、ありがとうございます。 通常の(オブジェクトではない)型の場合、ルーチン呼び出しのByRef(デフォルト)パラメータでは、チェック**はコンパイル時に行われます! 私はそれについて考えていますが、おそらくほとんどの場合、コードの複数の部分が同じ変数をさまざまな型のものとみなすことを可能にしますが、非常に複雑で面倒です。 – gbr
最終的に暗黙の強制的なことと、コンパイル時のチェックが完全に欠落している(私はそれに気づいていませんでした)ということを考えると、静的検査はVB開発者の心の中にはあまりありませんでした。 – gbr
ところで、VB 2010で(Option Strict Offを使って)試してみましたが、私が参照した質問([expected-type-mismatch-error](https:/) /stackoverflow.com/questions/549357/expected-type-mismatch-error))、おそらく最初の.Netバージョンでのみ欠落していました...? – gbr