Directcast & Ctype различия с перечислениями - PullRequest
13 голосов
/ 13 октября 2009
 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

Почему CType работает, а DirectCast не с тем же синтаксисом? Тем не менее, если я приведу selectedValue к int до того, как DirectCast, то это сработает

Привет

_Eric

1 Ответ

21 голосов
/ 13 октября 2009

Причина в том, что CType и DirectCast - это принципиально разные операции.

DirectCast - это механизм приведения в VB.Net, который допускает только определенные CLR преобразования. Это даже более строгое ограничение, чем версия приведения C #, потому что она не учитывает определенные пользователем преобразования.

CType - это лексический механизм литья. Он учитывает правила CLR, определенные пользователем преобразования и определенные преобразования VB.Net. Короче говоря, он сделает все возможное, чтобы создать действительное преобразование для объекта указанного типа.

В данном конкретном случае вы пытаетесь преобразовать значение в Enum, который не имеет преобразования, определенного в CLR, и, следовательно, не удается. Однако среда выполнения VB.Net смогла найти лексическое преобразование для решения проблемы.

Приличное обсуждение различий существует здесь:

...