代码之家  ›  专栏  ›  技术社区  ›  Eric

Directcast与枚举的类型差异(&C)

  •  13
  • Eric  · 技术社区  · 16 年前
     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 在我之前

    当做

    1 回复  |  直到 11 年前
        1
  •  22
  •   bdukes Jon Skeet    11 年前

    原因是 CType DirectCast

    直播 是VB.Net中的强制转换机制,它只允许CLR定义的转换。因为它不考虑用户定义的转换,所以它比铸造的C版本更具限制性。

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

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

    这里有一个关于差异的体面讨论: