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

Pourquoi le travail CType et DirectCast ne pas la même syntaxe? Pourtant, si je jette l'selectedValue à un int avant DirectCast, il fonctionnedifférences DirectCast & Ctype avec énumérations

Cordialement

_Eric

Répondre

19

La raison en est parce que CType et DirectCast sont fondamentalement différentes opérations.

DirectCast est un mécanisme de fonderie dans VB.Net qui permet uniquement les conversions définies CLR. Il est même plus restrictif que la version C# du casting, car il ne tient pas compte des conversions définies par l'utilisateur.

CType est un mécanisme de coulage lexical. Il prend en compte les règles CLR, les conversions définies par l'utilisateur et les conversions définies par VB.Net. En bref, il fera tout et n'importe quoi pour créer une conversion valide pour un objet à un type spécifié.

Dans ce cas particulier, vous essayez de convertir une valeur en Enum qui n'a pas de conversion CLR définie et donc échoue. L'environnement d'exécution VB.Net a toutefois été capable de trouver une conversion lexicale pour résoudre le problème.

Une bonne discussion sur les différences existe ici:

+1

Merci. Quelle serait la meilleure pratique à ce sujet? Explicite cast la selectedValue à un int et directcast (# 2), ou simplement Ctype (# 3) – Eric

+0

Je préfère CType chaque fois que j'ai affaire à des valeurs enum – JaredPar

+0

@Eric: un DirectCast devrait être utilisé quand un objet est d'un type donné et vous le jetez à ce type. Une chaîne n'est pas un Enum, et aucun n'est un entier. Si vous voulez d'abord convertir un entier en entier, cela pourrait rendre votre code plus clair, mais utiliser DirectCast ne fera que créer des confusions. – jmoreno

Questions connexes