2015-06-18 6 views
5

pisałem:Jaka jest różnica między tymi blokami kodu, dlaczego ten pierwszy ulega awarii i jak mam to debugować?

MfgRecipeTypeKey = If(placeholderMRTK Is Nothing, 0, placeholderMRTK) 

i to wszystko w porządku, ale kiedy placeholderMRTK faktycznie jest Nic się nie powiedzie, nie podnosząc wyjątek, tylko rzucić sub (MyBase.Load dla postaci dialogowym) i kontynuuje na z aplikacją. Kiedy przepisuję to jako:

If placeholderMRTK Is Nothing Then 
     MfgRecipeTypeKey = 0 
    Else 
     MfgRecipeTypeKey = placeholderMRTK 
    End If 

działa poprawnie. Myślałem, że te dwie są logicznymi odpowiednikami.

Więc:

1) Jaka jest rzeczywista różnica między tymi dwoma, że ​​ja nie wiem?

2) Dlaczego pierwsza może zawieść? Zastanawiam się, czy nie jest to kwestia sporadycznego problemu z typowaniem, ale oba placeholderMRTK i MfgRecipeTypeKey są zadeklarowane jako Byte? (bajt zerowy).

3) Dlaczego wykonanie po prostu wypada z subu bez przedstawienia mi wyjątku. Kiedy ta linia jest podświetlona w Visual Studio (Pro 2013, jeśli ma znaczenie) i I f11 dla następnej linii, to po prostu przeskakuje i uruchamia zdarzenie renderowania datagrid, a następnie prezentuje moje okno dialogowe, ale bez ważnych przydziałów danych, które miały miejsce pod maską . A biorąc pod uwagę, że to robi (czy jest to nowe zachowanie w 2013 r.?), Jak mam debugować?

Dziękujemy za poświęcony czas i uwagę!

+0

Jeżeli obie zmienne są pustych zamiast nic nie można użyć metody hasValue, na przykład: MfgRecipeTypeKey.Value = Jeśli (placeholderMRTK.HasValue, placeholderMRTK.Value, 0) – sblandin

+1

Co do trzeciego pytania: [VS2010 robi nie wyświetla nieobsługiwanego komunikatu wyjątku w aplikacji WinForms w 64-bitowej wersji systemu Windows] (https: // stackoverflow.com/questions/4933958/vs2010-nie-show-nieobsługiwany-wyjątek-wiadomość-w-a-winform-aplikacja-na-a/11997142 # 11997142) – sloth

+0

Aby dowiedzieć się, dlaczego pierwsze oświadczenie nie działa, sugeruję wykonanie to (tak jak test) po zakończeniu ładowania programu obsługi zdarzeń. W ten sposób powinieneś być w stanie zobaczyć wyjątek. – Blackwood

Odpowiedz

4

Użyte przez użytkownika If() operator with three arguments oczekuje, że dwa możliwe odgałęzienia zwrócą wartość tego samego typu.

To nie jest przypadek, gdy używasz

MfgRecipeTypeKey = If(placeholderMRTK Is Nothing, 0, placeholderMRTK) 

od placeholderMRTK jest typu Nullable(Of Byte) i 0 jest typu Integer.


If placeholderMRTK Is Nothing Then 
    MfgRecipeTypeKey = 0 
Else 
    MfgRecipeTypeKey = placeholderMRTK 
End If 

prace VB.Net ponieważ pozwala na niejawna konwersja z 0 do Byte.


Można użyć

MfgRecipeTypeKey = If(placeholderMRTK Is Nothing, CType(0, Byte), placeholderMRTK) 

przekształcenie 0 w Byte, lub po prostu użyć

MfgRecipeTypeKey = If(placeholderMRTK, 0) 
+0

Słodki! To działa świetnie. – clweeks

1

Można użyć wbudowanej funkcji GetValueOrDefault.

MfgRecipeTypeKey = placeholderMRTK.GetValueOrDefault(0) 
+1

Wyraźnie powinienem zbadać typy nullable przed rozpoczęciem korzystania z nich po raz pierwszy. Mam teraz nieelegancki kod nieeleganckiego kodu. To jest świetne, dzięki! – clweeks