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?
Sì, di default di Int a '0' in VB ... – Codexer