Boolean e Nothing

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 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(NothingBoolean).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!

Print | posted on lunedì 30 maggio 2005 21:35

Comments on this post

# re: Boolean e Nothing

Requesting Gravatar...
Ciao Michele,

Quando scrivi:

Dim b As Boolean = Nothing

b è un value type *unboxed* che viene inizializzato a False. Come codice IL generato, lo statement

Dim b As Boolean = Nothing

è identico a questo:

Dim b As Boolean = False

e non a questo:

Dim b As Boolean

anche se il valore della b in entrambi i casi è lo stesso False.

Il comportamento del compilatore VB .NET non mi sembra del tutto normale (infatti C# darebbe l'errore CS0037 - "Cannot convert null to 'bool' because is a value type"). Probabilmente in 1.1, VB .NET "nota" un'inizializzazione *esplicita* al valore di default.

Poi, quando chiami:

b.ToString

semplicemente chiami il ToString del value type Boolean.

Per quanto riguarda:

DirectCast(Nothing, Boolean).ToString

nella Beta 2 (2.0.50215) non genera più errore a RT. Sono tentato quindi a credere che, nella 2.0, il compilatore non solo "nota" semanticamente l'inizializzazione a un valore default ma, fa proprio un casting.
Left by Adrian Florea on mag 31, 2005 9:37

# re: Boolean e Nothing

Requesting Gravatar...
Grazie Adrian!
In effetti é più o meno quello che avevo notato che veniva caricato uno zero al posto di un null. La cosa bella é che succede lo stesso anche senza l'inizializzazione esplicita, ma con un semplice assegnamento. Me ne sono accorto perché facendo refactoring ho un metodo che é passato dal rendere un Object a un Boolean e mi era rimasto in giro un Return Nothing che stranamente NON dava errori. Sono felice di sapere che VB.NET 2 ha almeno una interpretazione univoca, anche se, onestamente il comportamente di C# mi sembra di gran lunga il più corretto.
Left by Michele Bernardi on mag 31, 2005 10:35
Comments have been closed on this topic.