2015-05-27 9 views
9

Ho ricercato l'equivalenza di parola chiave C#default in VB.NET e ho trovato this question.VB Nullables and Nothings

Poi mi sono incuriosito. Un po 'di background - Sto lavorando con l'analisi di un foglio di calcolo Excel, dove molte colonne possono essere nulle, e c'è sicuramente una differenza per me tra una colonna intera che è 0 ed è null.

ho scritto un po 'di metodo parse:

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Dim j As Integer 

    If Integer.TryParse(i, j) Then 
     Return j 
    Else 
     Return Nothing 
    End If 
End Function 

questo sembra funzionare correttamente. Ma qui, posso restituire un Integer se voglio:

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Return 2 'or Return Nothing 
End Function 

che posso in C# così:

static void Main(string[] args) 
{ 
    int? j = Test("1"); 
} 

public static int? Test(string i) 
{ 
    return 2; //or return null 
} 

Nel codice di cui sopra, se cambio j a un int, io ottenere un errore di conversione in fase di compilazione, che ha senso.

Ora la mia domanda - in VB, se tento un approccio simile:

Sub Main() 
    Dim j As Integer = Test("hello") 
End Sub 

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Dim j As Integer 
    Return If(Integer.TryParse(i, j), j, Nothing) 
End Function 

o, nel mio caso di prova in cui i non è un Integer può essere riscritta come:

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Return DirectCast(Nothing, Integer) 
End Function 

a causa del modo in cui Nothing funziona in VB.NET, questo codice viene compilato ed eseguito senza errori - j è impostato su 0, predefinito di Numero intero.

Mi sembra così sporco. In questo scenario è possibile modificare leggermente le intenzioni del metodo senza alcun avviso o errore. Sono solo curioso, suppongo, questo è un sottoprodotto involontario del modo in cui Nothing funziona in VB, o è questo lo scopo previsto?

+0

Sì, di default di Int a '0' in VB ... – Codexer

risposta

4

Il codice VB.Net viene compilato poiché si utilizza l'associazione tardiva, che consente di modificare il tipo di una variabile in fase di esecuzione.

Se si compila il codice con OPTION STRICT ON, si otterrà un errore di compilazione come:

Option Strict On non consente le conversioni implicite da 'Integer?' a 'Integer'.

+0

grazie . Semplice spiegazione, ma ha senso. Altri motivi per cui davvero non mi piace VB. – Jonesopolis

2

Non è possibile assegnare NULL ad un tipo di valore in VB.Net in cui si crea un'istanza quel tipo con il suo valore di default. Nel tuo caso non si sta creando un intero NULL, ma un intero che contiene il valore predefinito 0.

Un'altra buona nota: girare Option Strict On

+0

La tua prima frase contraddice la tua seconda. Certo, puoi assegnare "Nulla" a una variabile di un tipo di valore per ottenere il valore predefinito di quel tipo. Lo dici anche nella tua seconda frase. – sloth

+0

Grazie per la correzione, non l'ho visto! – Codexer