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

Warum hat die CType Arbeit und die DirectCast nicht mit der gleichen Syntax? Doch wenn ich die selectedValue zu einem int bevor ich DirectCast gegossen, dann funktioniert esDirect & Ctype Unterschiede mit Aufzählungen

Grüße

_Eric

Antwort

19

Der Grund dafür ist, weil CType und DirectCast sind grundsätzlich andere Operationen.

DirectCast ist ein Casting-Mechanismus in VB.Net, der nur CLR-definierte Konvertierungen ermöglicht. Es ist noch restriktiver als die C# -Version von Casting, da benutzerdefinierte Conversions nicht berücksichtigt werden.

CType ist ein lexikalischer Gießmechanismus. Es berücksichtigt CLR-Regeln, benutzerdefinierte Conversions und VB.Net-definierte Conversions. Kurz gesagt, es wird alles Mögliche getan, um eine gültige Konvertierung für ein Objekt zu einem bestimmten Typ zu erstellen.

In diesem speziellen Fall versuchen Sie, einen Wert in ein Enum zu konvertieren, das keine CLR-definierte Konvertierung hat und daher fehlschlägt. Die VB.Net-Laufzeitumgebung konnte jedoch eine lexikalische Konvertierung finden, um das Problem zu beheben.

Eine anständige Diskussion über die Unterschiede besteht hier:

+1

Dank. Was wäre die beste Vorgehensweise dabei? Explizite Cast der ausgewähltenValue zu einem int und Directcast (# 2), oder nur Ctype (# 3) – Eric

+0

Ich bevorzuge CType, wenn ich mit Enum-Werte – JaredPar

+0

@Eric: ein DirectCast sollte verwendet werden, wenn ein Objekt von einem bestimmten Typ ist und du machst es auf diesen Typ. Eine Zeichenfolge ist keine Enumeration und keine Ganzzahl. Wenn Sie zuerst in eine Ganzzahl umwandeln möchten, macht das Ihren Code vielleicht klarer, aber die Verwendung von DirectCast wird die Dinge nur verwirren. – jmoreno