2015-06-18 10 views
5

ho scritto:Qual è la differenza tra questi blocchi di codice, perché il primo errore e come dovrei eseguire il debug di questo?

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

e questo è tutto bene, ma quando in realtà placeholderMRTK è Niente, non riesce, senza sollevare un'eccezione, basta smettere il sub (MyBase.Load per una forma di dialogo) e continuando su con l'applicazione. Quando lo riscrivo come:

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

funziona correttamente. Pensavo che i due fossero equivalenti logici.

Quindi:

1) Qual è la differenza reale tra quei due che io non so?

2) Perché il primo potrebbe fallire? Mi chiedo se si tratti di un problema di typecasting, ma sia placeholderMRTK che MfgRecipeTypeKey sono dichiarati come Byte? (byte nullable) tipi.

3) Perché l'esecuzione è appena caduta dal sottotitolo senza presentarmi un'eccezione. Quando quella linea è evidenziata in Visual Studio (Pro 2013 se è importante) e io f11 per la riga successiva, scatta e avvia un evento di rendering datagrid e poi presenta la mia finestra di dialogo, ma senza alcuni importanti dati che hanno avuto luogo sotto la cappa . E visto che lo fa (è questo nuovo comportamento nel 2013?), Come faccio a essere debugging?

Grazie per il vostro tempo e attenzione!

+0

Se entrambe le variabili sono annullabili invece c'è niente che puoi utilizzare il metodo HasValue, ad esempio: MfgRecipeTypeKey.Value = Se (placeholderMRTK.HasValue, placeholderMRTK.Value, 0) – sblandin

+1

Per quanto riguarda la terza domanda: [VS2010 fa non mostra un messaggio di eccezione non gestito in un'applicazione WinForms su una versione a 64 bit di Windows] (https: // StackOverflow.it/questions/4933958/vs2010-does-not-show-unhandled-exception-message-in-a-winforms-application-on-a/11997142 # 11997142) – sloth

+0

Per scoprire perché la prima affermazione non funziona, suggerisco di eseguire esso (proprio come un test) qualche tempo dopo il completamento del Load Event Handler. In questo modo dovresti essere in grado di vedere l'eccezione. – Blackwood

risposta

4

Il If() operator with three arguments che si utilizza prevede che i due rami possibili restituiscano un valore dello stesso tipo.

Non è questo il caso quando si utilizza

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

dal placeholderMRTK è di tipo Nullable(Of Byte) e 0 è di tipo Integer.


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

opere perché VB.Net consente la conversione implicita di 0-Byte.


Si potrebbe utilizzare

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

conversione del 0 in un Byte, o semplicemente usare

MfgRecipeTypeKey = If(placeholderMRTK, 0) 
+0

Dolce! Funziona alla grande. – clweeks

1

È possibile utilizzare la funzione built-in GetValueOrDefault.

MfgRecipeTypeKey = placeholderMRTK.GetValueOrDefault(0) 
+1

Ho chiaramente dovuto cercare i tipi nullable prima di iniziare a usarli per la prima volta. Ho una barca di codice inelegante per abbellire ora. È grandioso, grazie! – clweeks