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不能使用相同的语法?但是,如果我在DirectCast之前将selectedValue转换为int,那么它就可以工作
问候
_Eric
发布于 2009-10-13 19:04:48
原因是因为CType和DirectCast是根本不同的操作。
DirectCast是VB.Net中的一种强制转换机制,它只允许CLR定义的转换。它甚至比强制转换的C#版本更严格,因为它不考虑用户定义的转换。
CType是一种词法转换机制。它考虑了CLR规则、用户定义的转换和VB.Net定义的转换。简而言之,它会做任何事情和一切可能的事情来创建对象到指定类型的有效转换。
在这种特殊情况下,您正在尝试将一个值转换为一个没有定义CLR转换的Enum,因此它失败了。然而,VB.Net运行时能够找到一个词法转换来解决这个问题。
这里有一个关于差异的像样的讨论:
https://stackoverflow.com/questions/1562210
复制相似问题