Forse a chi usa C# e
viene da un background di programmatore C/C++ sembrerà normalissimo, ma per un
programmatore VB non avere errori di compilazione sulla prima di queste due
righe é piuttosto strano:
Dim B As Boolean = Nothing
MessageBox.Show(B.ToString)
Se avvio comparirà una messagebox che reciterà "false". Quindi Nothing
castato a Boolean é l'equivalente di false? Forse, ma, allora perché la
riga:
MessageBox.Show(DirectCast(Nothing, Boolean).ToString)
Invece genera un eccezione in esecuzione?
Decompilando con Reflector (in IL, perché in VB vengono entrambe tradotte con
le prime due linee) noto che l'inizio di queste espressioni é:
L_0000: ldc.i4.0
L_0001: stloc.0
L_0002: ldloca.s flag1
Pur non capendo niente di IL mi pare di vedere che il mio Nothing é stato
trasformato in zero, il secondo caso invece inizia con:
L_0000: ldnull
L_0001: unbox bool
L_0002: ldobj bool
Forse l'arcano é chiarito: il compilatore di VB traduce Nothing in zero nel
primo caso mentre nel secondo giustamente tenta un unboxing di
null che fallisce!