/ / Bug? Jeśli przypiszesz wartość do liczby całkowitej dopuszczającej wartość zerową za pośrednictwem operatora trójskładnikowego, nie może ona stać się zerowa - vb.net, nullable, ternary-operator

Pluskwa?? Jeśli przypiszesz wartość zerowalnej liczbie całkowitej przez operatora potrójnego, to nie może ona mieć wartości null - vb.net, nullable, trójskładnik-operator

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 1

Problemem 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ść.