differenze DirectCast e tipo C con enumerazioni
-
21-09-2019 - |
Domanda
Public Enum Fruit
Red_Apple = 1
Oranges
Ripe_Banana
End Enum
Private Sub InitCombosRegular()
Dim d1 As New Dictionary(Of Int16, String)
For Each e In [Enum].GetValues(GetType(Fruit))
d1.Add(CShort(e), Replace(e.ToString, "_", " "))
Next
ComboBox1.DataSource = d1.ToList
ComboBox1.DisplayMember = "Value"
ComboBox1.ValueMember = "Key"
ComboBox1.SelectedIndex = 0
End Sub
'This fails
Dim combo1 = DirectCast(ComboBox1.SelectedValue, Fruit) ' Fails
'these both work
Dim combo2 = DirectCast(CInt(ComboBox1.SelectedValue), Fruit) 'works
Dim combo3 = CType(ComboBox1.SelectedValue, Fruit) 'works
Perché il lavoro CType
e il DirectCast
fa non con la stessa sintassi? Ma se io scaccio il selectedValue
a un int
prima DirectCast
, allora funziona
Saluti
_Eric
Soluzione
Il motivo è perché CType
e DirectCast
sono operazioni fondamentalmente differenti.
DirectCast
è un meccanismo di colata in VB.Net che consente solo conversioni CLR definiti. E 'ancora più restrittiva rispetto alla versione C # di getto, perché non considera le conversioni definite dall'utente.
CType
è un meccanismo di fusione lessicale. Si ritiene regole CLR, conversioni definite dall'utente e conversioni VB.Net definiti. In breve si farà di tutto e tutto il possibile per creare una conversione valida per un oggetto a un tipo specificato.
In questo caso particolare si sta cercando di convertire un valore per un Enum che non ha una conversione CLR definito e, quindi, sta fallendo. Il runtime VB.Net però è stato in grado di trovare una conversione lessicale per soddisfare il problema.
Una discussione decente sulle differenze esiste qui: