2012-04-19 17 views
5

Eventuali duplicati:
Bug?? If you assign a value to a nullable integer via a ternary operator, it can't become nullQual è l'equivalente di VB.NET della parola chiave predefinita di C#?

Mentre questa domanda può sembrare come un duplicato di molti, in realtà è stato chiesto per un motivo specifico. Prendete questo codice, ad esempio:

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

In quel codice, l'espressione ternaria dovrebbe ritorneremo Niente, ma è l'impostazione n a 0. Se questo fosse C#, potrei dire default(int?) e sarebbe funzionare perfettamente. Ora sembra che dovrò mollare il ternario e usare un blocco regolare di If, ma voglio davvero usare il ternario.

Se Nulla era veramente VB.NET equivalente al valore predefinito di C#, come si può spiegare questo comportamento?

+0

'Nothing' in questo caso equivale a' default (int) 'perché il tipo inferito basato sull'espressione è' int', non 'int?'. Questo può essere visto con 'If (true, Nothing, new Integer? (1))' – Marc

+0

Quindi è sicuro dire che VB.NET * non ha * un equivalente di default di C#. Se così fosse, avrebbe potuto utilizzare l'inferenza del tipo per determinare che Niente, in questo caso, equivale al valore predefinito di un numero nullable che è Niente, non 0. – oscilatingcretin

+0

In modo indiretto, è corretto. In C#, il 'default' prende un tipo, che può essere usato per l'inferenza. In VB, sembra che "Nothing" giochi il ruolo passivo in questo. – Marc

risposta

6

VB.NET equivale a C23default è la parola chiave Nothing. Il codice che hai scritto dovrebbe essere compilato correttamente, purché Id.Value restituisca un valore Integer.

Il motivo per cui il campione aggiornato non funziona è a causa della natura di Nothing. In VB.NET Nothing è il valore vuoto ed è convertibile in qualsiasi tipo. Ora per un'espressione If, il compilatore deve inferire quale dovrebbe essere il tipo di ritorno, e lo fa osservando i due argomenti del valore.

Il valore Nothing non ha alcun tipo, ma il valore letterale 1 ha il tipo Integer. Nothing è convertibile in Integer quindi il compilatore determina che Integer è il tipo migliore qui. Ciò significa che quando si sceglie Nothing come valore, esso verrà interpretato come Integer e non Integer?.

Il modo più semplice per risolvere questo problema è indicare esplicitamente al compilatore che si desidera che 1 sia trattato come Integer?.

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

Nella mia domanda, sto usando Niente nell'espressione ternaria correttamente? Altrimenti, come lo modificheresti per fare ciò che sto provando? Hai, per caso, tentato di riprodurre il problema usando il tuo codice? – oscilatingcretin

+0

@oscilatingcretin il codice che stai usando va bene. Ho scritto un campione a livello locale e ha funzionato come previsto – JaredPar

+0

Okay, quindi prova il codice aggiornato che ho modificato nella mia domanda. Quando esegui quella singola riga di codice, 'n' è impostato su Nothing come previsto? Quando lo eseguo, è impostato su 0. – oscilatingcretin