2009-10-13 13 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 

¿Por qué la CType trabajo y la DirectCast no con la misma sintaxis? Sin embargo, si yo echo la selectedValue a un int antes DirectCast, entonces funcionaDirectCast y Ctype diferencias con enumeraciones

Saludos

_Eric

Respuesta

19

La razón es porque CType y DirectCast son fundamentalmente diferentes operaciones.

DirectCast es un mecanismo de conversión en VB.Net que solo permite conversiones CLR definidas. Es incluso más restrictivo que la versión C de casting porque no considera las conversiones definidas por el usuario.

CType es un mecanismo de fundición léxica. Considera las reglas de CLR, las conversiones definidas por el usuario y las conversiones definidas de VB.Net. En resumen, hará todo lo posible para crear una conversión válida para un objeto a un tipo específico.

En este caso particular, intenta convertir un valor en un Enum que no tiene una conversión CLR definida y, por lo tanto, está fallando. Sin embargo, el tiempo de ejecución de VB.Net pudo encontrar una conversión léxica para satisfacer el problema. existe

Una discusión decente en las diferencias aquí:

+1

Gracias. ¿Cuál sería la mejor práctica en esto? Transmitir explícitamente el valor seleccionado a int y directcast (n. ° 2), o solo tipo C (n. ° 3) – Eric

+0

Prefiero CType cada vez que estoy tratando con valores enum – JaredPar

+0

@Eric: se debe usar un DirectCast cuando un objeto es de un tipo determinado , y lo estás lanzando a ese tipo. Una cadena no es un Enum, y tampoco es un número entero. Si primero quieres convertir un número entero, eso puede hacer que tu código sea más claro, pero usar DirectCast simplemente confundirá las cosas. – jmoreno