首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举的Directcast和Ctype差异

枚举的Directcast和Ctype差异
EN

Stack Overflow用户
提问于 2009-10-13 18:49:06
回答 1查看 11.7K关注 0票数 13
代码语言:javascript
复制
 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-13 19:04:48

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

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

CType是一种词法转换机制。它考虑了CLR规则、用户定义的转换和VB.Net定义的转换。简而言之,它会做任何事情和一切可能的事情来创建对象到指定类型的有效转换。

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

这里有一个关于差异的像样的讨论:

  • http://msdn.microsoft.com/en-us/library/aa289509(VS.71).aspx#vbtchmicrosoftvisualbasicnetinternalsanchor10
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1562210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档