2012-04-19 24 views
5

Powiel możliwe:
Bug?? If you assign a value to a nullable integer via a ternary operator, it can't become nullCo to jest odpowiednik VB.NET domyślnego słowa kluczowego C#?

Chociaż to pytanie może wydawać się duplikat wielu, to jest rzeczywiście poprosił o konkretnej przyczyny. Wziąć ten kod, na przykład:

Dim n As Integer? = If(True, Nothing, 1) 

w tym kodowania, potrójny wyraz powinny wrócimy Nic, ale to ustawienie n 0. Jeżeli to C#, mogę powiedzieć default(int?) i będzie działać doskonale. Teraz wygląda na to, że będę musiał opuścić trójskładnik i użyć zwykłego bloku If, ale naprawdę chcę użyć potrójnego.

Jeśli nic tak naprawdę nie odpowiada VB.NET do wartości domyślnej C#, jak możesz wyjaśnić to zachowanie?

+0

'Nic" w tym przypadku równa się 'default (int)', ponieważ twój wywnioskowany typ oparty na wyrażeniu to 'int', a nie' int? '. Można to zobaczyć za pomocą 'If (true, Nothing, new Integer? (1))' – Marc

+0

Więc można bezpiecznie powiedzieć, że VB.NET * nie * ma odpowiednik domyślnego C#. Gdyby tak było, mógł użyć inferencji typu, aby stwierdzić, że Nic w tym przypadku nie jest równe wartości domyślnej wartości zerowej, która jest równa Nic, a nie 0. – oscilatingcretin

+0

W sposób pośredni, to jest poprawne. W języku C# 'default' przyjmuje typ, który może być użyty do wywoływania. W VB wydaje się, że "Nic" odgrywa w tym bierną rolę. – Marc

Odpowiedz

6

Identyfikator VB.NET odpowiadający C# default jest słowem kluczowym Nothing. Kod, który napisałeś, powinien się dokładnie skompilować, o ile Id.Value zwróci wartość Integer.

Przyczyna, dla której zaktualizowana próbka się nie zgadza, jest ze względu na naturę Nothing. W VB.NET Nothing jest pusta wartość i można ją przekształcić w dowolny typ. Teraz dla wyrażenia If, kompilator musi wywnioskować, jaki powinien być typ powrotu, i robi to, patrząc na dwa argumenty wartości.

Wartość Nothing nie ma typu, ale literał 1 ma typ Integer. Nothing jest zamienny na Integer, więc kompilator określa, że ​​Integer to najlepszy typ. Oznacza to, że gdy wybrana zostanie wartość Nothing, zostanie ona zinterpretowana jako Integer, a nie Integer?.

Najprostszym sposobem rozwiązania tego problemu jest wyraźne poinformowanie kompilatora, że ​​chcesz, aby 1 był traktowany jako Integer?.

Dim n As Integer? = If(True, Nothing, CType(1, Integer?)) 
+0

W moim pytaniu, czy używam Nic w wyrażeniu potrójnym poprawnie? Jeśli nie, w jaki sposób zmodyfikujesz go tak, by wykonywał to, co próbuję? Czy przez przypadek próbowałeś odtworzyć problem za pomocą własnego kodu? – oscilatingcretin

+0

@oscilatingcretin kod, którego używasz jest w porządku. Napisałem próbkę lokalnie i działało zgodnie z oczekiwaniami. – JaredPar

+0

Dobra, spróbuj zaktualizowanego kodu, który zredagowałem na moje pytanie. Po uruchomieniu tego pojedynczego wiersza kodu, 'n' jest ustawiany na Nothing zgodnie z oczekiwaniami? Po uruchomieniu jest on ustawiony na 0. – oscilatingcretin

Powiązane problemy