dim val1 As Integer? = If(5 > 2, Nothing, 43)
" val1 = 0
dim val1 As Integer? = If(5 > 2, Nothing, Nothing)
" val1 = Nothing
Co daje? Czy to błąd, czy coś przeoczyłem?
Odpowiedzi:
13 dla odpowiedzi nr 1Problemem jest Nothing
w VB.NET działa inaczej niż, na przykład, null
w C #. Gdy Nothing
jest używany w kontekście typu wartości (takiego jak Integer
) reprezentuje domyślną wartość tego typu. W tym przypadku to „0.
W pierwszym przykładzie oba odgałęzienia operatora trójskładnikowego są poprawne Integer
wartości. Prawdziwa gałąź reprezentuje 0, a fałszywa gałąź 43.
W drugim przykładzie żadna gałąź operatora trójskładnikowego nie jest poprawna Integer
wartość, zmuszając kompilator VB.NET do przyjęcia, że cały operator powraca Object
, nie Integer
.
Aby pierwszy przykład działał tak, jak chcesz, musisz wyjaśnić kompilatorowi, że operator trójskładnikowy powinien rozwiązać Integer?
nie, nie Integer
lub Object
. Możesz to zrobić w ten sposób:
dim val1 As Integer? = If(5 > 2, Nothing, New Integer?(43))
Poprzez jawne utworzenie fałszywej gałęzi operatora Integer?
, Nothing
w prawdziwej gałęzi będzie reprezentować wartość pustą, zamiast domyślnej Integer
wartość.