Domanda

 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

Perché il lavoro CType e il DirectCast fa non con la stessa sintassi? Ma se io scaccio il selectedValue a un int prima DirectCast, allora funziona

Saluti

_Eric

È stato utile?

Soluzione

Il motivo è perché CType e DirectCast sono operazioni fondamentalmente differenti.

DirectCast è un meccanismo di colata in VB.Net che consente solo conversioni CLR definiti. E 'ancora più restrittiva rispetto alla versione C # di getto, perché non considera le conversioni definite dall'utente.

CType è un meccanismo di fusione lessicale. Si ritiene regole CLR, conversioni definite dall'utente e conversioni VB.Net definiti. In breve si farà di tutto e tutto il possibile per creare una conversione valida per un oggetto a un tipo specificato.

In questo caso particolare si sta cercando di convertire un valore per un Enum che non ha una conversione CLR definito e, quindi, sta fallendo. Il runtime VB.Net però è stato in grado di trovare una conversione lessicale per soddisfare il problema.

Una discussione decente sulle differenze esiste qui:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top