Различия Directcast и Ctype с перечислениями

 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

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

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

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

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

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