QA@IT

VB(2015)でNull許容型でないのにNothingの代入が許可される

11556 PV

以下のようなコードですが、変数 i As Integer がNull許容型でもないのにNothingを代入してもコンパイルが通ってしまいます。
Integer への Nothing 代入をコンパイル時にチェックする方法は無いのでしょうか?
ご教示頂ければと思います。

Option Explicit On
Option Strict On
Option Infer On
Module Module1
    Sub Main()
        Dim i As Integer = 1
        i = Nothing
        Console.WriteLine($"i={i}")
    End Sub
End Module

il を確認すると、「i = Nothing」が「i = 0」となってコンパイルされているようです。

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
  // コード サイズ       26 (0x1a)
  .maxstack  2
  .locals init ([0] int32 i)
  IL_0000:  ldc.i4.1
  IL_0001:  stloc.0
  IL_0002:  ldc.i4.0
  IL_0003:  stloc.0
  IL_0004:  ldstr      "i={0}"
  IL_0009:  ldloc.0
  IL_000a:  box        [mscorlib]System.Int32
  IL_000f:  call       string [mscorlib]System.String::Format(string, object)
  IL_0014:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0019:  ret
} // end of method Module1::Main

実際に実行結果も「i=0」となります。

Option Explicit On も記述しています。
参考までに"当然ですが"C#の場合、以下のコードはコンパイルすら通りません。

int i = null;

回答

以下の記事によると、

"VB.NETでは、Nothingキーワードはどんな値にも変換できる。つまり、Integer型の変数に代入できる。変換されるとき、Nothingの値はその型のデフォルト値と見なされる。Integer型なら0がデフォルト値なので、0という値が変数aに代入されたというわけである"

・・・ということだそうです。

プロフェッショナルVB.NETプログラミング
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet30/vb6tonet30_02.html

#やっぱり、VB を使うのは止めた方がよさそうです。

編集 履歴 (0)
  • 出典までありがとうございました。
    Nothing(VB) ≒ null(C#) であると理解しました。

    つい先日も以下の代入結果が [0]になってしまう(Nothingではなく)ことで痛い目にあいました。
    Dim i As Integer? = If(True, Nothing, 1)

    >VB を使うのは止めた方がよさそうです。
    同感です。どのタイミングで乗り換えるか...
    -
  • 解決したならクローズしてください。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。