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

Dlaczego CType praca i DirectCast nie z tej samej składni? Jednak gdybym rzucił selectedValue do int zanim DirectCast, to działaDirectCast i typu C różnice z teksty stałe

Pozdrowienia

_Eric

Odpowiedz

19

Powodem jest, ponieważ CType i DirectCast są fundamentalnie różne operacje.

DirectCast to mechanizm rzutowania w VB.Net, który umożliwia tylko zdefiniowane konwersje CLR. Jest jeszcze bardziej restrykcyjne niż w wersji C#, ponieważ nie uwzględnia konwersji zdefiniowanych przez użytkownika.

CType jest leksykalnym mechanizmem odlewania. Obejmuje ona reguły CLR, konwersje zdefiniowane przez użytkownika i konwersje zdefiniowane przez VB.Net. W skrócie, zrobi wszystko, co możliwe, aby stworzyć prawidłową konwersję obiektu na określony typ.

W tym konkretnym przypadku próbujesz przekonwertować wartość na wyliczenie, które nie ma zdefiniowanej konwersji CLR, a tym samym nie działa. Środowisko wykonawcze VB.Net było jednak w stanie znaleźć leksykalną konwersję, aby rozwiązać problem.

Przyzwoity dyskusja na temat różnic istnieje tutaj:

+1

Dzięki. Jaka byłaby najlepsza praktyka w tej dziedzinie? Jawne rzucanie wybranej wartości do int i directcast (# 2) lub po prostu Ctype (# 3) – Eric

+0

Wolę CType, gdy mam do czynienia z wartościami wyliczeniowymi – JaredPar

+0

@Eric: DirectCast powinien być używany, gdy obiekt jest danego typu i rzucasz go do tego typu. Łańcuch nie jest enumem, a żadna nie jest liczbą całkowitą. Jeśli chcesz najpierw rzutować na liczbę całkowitą, może to sprawić, że Twój kod będzie bardziej przejrzysty, ale użycie DirectCast po prostu wprowadzi zamieszanie. – jmoreno

Powiązane problemy