直播& Ctype与枚举的差异

时间:2009-10-13 18:49:06

标签: vb.net 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 个答案:

答案 0 :(得分:21)

原因是因为CTypeDirectCast是根本不同的操作。

DirectCast是VB.Net中的一种转换机制,它只允许CLR定义的转换。它比C#版本的转换更具限制性,因为它不考虑用户定义的转换。

CType是一种词法铸造机制。它考虑了CLR规则,用户定义的转换和VB.Net定义的转换。简而言之,它将尽一切可能为对象创建到指定类型的有效转换。

在这种特殊情况下,您尝试将值转换为没有CLR定义转换的Enum,因此它失败了。然而,VB.Net运行时能够找到词法转换来满足该问题。

这里存在关于差异的体面讨论: