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

が機能し、が同じ構文で機能しないCTypeのはなぜですか? しかし、 Iの前にDirectCastをキャストすると、機能しますselectedValueintDirectCast

よろしく

_エリック

4

1 に答える 1

22

その理由は、CTypeDirectCastが根本的に異なる操作だからです。

DirectCastCLR で定義された変換のみを許可する VB.Net のキャスト メカニズムです。ユーザー定義の変換を考慮しないため、C# バージョンのキャストよりもさらに制限が厳しくなります。

CTypeレキシカルキャストメカニズムです。CLR ルール、ユーザー定義の変換、および VB.Net 定義の変換が考慮されます。つまり、指定された型へのオブジェクトの有効な変換を作成するために可能な限りのことを行います。

この特定のケースでは、CLR で定義された変換を持たない Enum に値を変換しようとしているため、失敗しています。しかし、VB.Net ランタイムは、問題を満たす字句変換を見つけることができました。

違いに関するまともな議論がここにあります:

于 2009-10-13T19:04:48.377 に答える