微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net – 直接和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不具有相同的语法?然而,如果我在SelectedCast之前将selectedValue转换为int,那么它可以工作

问候

_Eric

原因是因为CType和DirectCast是根本不同的操作.

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

CType是一个词汇投射机制.它考虑CLR规则,用户定义的转换和VB.Net定义的转换.简而言之,它将做任何事情,一切可能的话,创建一个对象到指定类型的有效转换.

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

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

> http://msdn.microsoft.com/en-us/library/aa289509(VS.71).aspx#vbtchmicrosoftvisualbasicnetinternalsanchor10

原文地址:https://www.jb51.cc/vb/255632.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐