2009-10-13 6 views
13
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 CType lavoro e il DirectCast non con la stessa sintassi? Ma se io scaccio il selectedValue a un int prima DirectCast, allora funzionaDirectCast & Ctype differenze con le enumerazioni

saluti

_Eric

risposta

19

Il motivo è perché CType e DirectCast sono operazioni fondamentalmente differenti.

DirectCast è un meccanismo di fusione in VB.Net che consente solo conversioni definite CLR. È ancora più restrittivo della versione di casting di C# perché non considera le conversioni definite dall'utente.

CType è un meccanismo di fusione lessicale. Considera le regole CLR, le conversioni definite dall'utente e le conversioni definite da VB.Net. In breve, farà tutto e tutto il possibile per creare una conversione valida per un oggetto a un tipo specificato.

In questo caso particolare si sta tentando di convertire un valore in un Enum che non ha una conversione definita CLR e quindi non riesce. Tuttavia, il runtime VB.Net è stato in grado di trovare una conversione lessicale per soddisfare il problema.

Una discussione decente sulle differenze esiste qui:

+1

Grazie. Quale sarebbe la migliore pratica su questo? Inserisce esplicitamente il valore selezionato in int e directcast (n. 2), o solo Ctype (n. 3) – Eric

+0

Preferisco CType ogni volta che ho a che fare con i valori enum – JaredPar

+0

@Eric: un DirectCast deve essere usato quando un oggetto è di un determinato tipo e lo stai trasmettendo a quel tipo. Una stringa non è un Enum e nemmeno un intero. Se si desidera eseguire il cast su un intero per primo, ciò potrebbe rendere il codice più chiaro, ma l'uso di DirectCast confonderà le cose. – jmoreno