Vb.net '';此处不能使用字符
使用这些变量:Vb.net '';此处不能使用字符,vb.net,visual-studio-2010,.net-4.0,nullable,Vb.net,Visual Studio 2010,.net 4.0,Nullable,使用这些变量: Dim d1 As Date? = Nothing Dim d2 As DateTime? = Nothing Dim i1 As Integer? = Nothing Dim i2 As Int32? = Nothing 为什么我可以这样做 Dim flag1 As Boolean = Date?.Equals(d1, d2) Dim flag2 As Boolean = Integer?.Equals(i1, i2) Dim flag3 As Boolean = Date
Dim d1 As Date? = Nothing
Dim d2 As DateTime? = Nothing
Dim i1 As Integer? = Nothing
Dim i2 As Int32? = Nothing
为什么我可以这样做
Dim flag1 As Boolean = Date?.Equals(d1, d2)
Dim flag2 As Boolean = Integer?.Equals(i1, i2)
Dim flag3 As Boolean = DateTime?.Equals(d2, d1)
Dim flag4 As Boolean = Int32?.Equals(i2, i1)
…但不允许这样做?:
Dim flag1 As Boolean = Date?.Equals(d1, d2)
Dim flag2 As Boolean = Integer?.Equals(i1, i2)
Dim flag3 As Boolean = DateTime?.Equals(d2, d1)
Dim flag4 As Boolean = Int32?.Equals(i2, i1)
最后一个代码将失败,并显示以下错误:
此处不能使用“?”字符
VB.NET开发人员不应该使用C#关键字(宗教,你知道)。不过说真的,我同意@Konrad的说法,这看起来像是一个编译器错误。如果你有其他的VS,在那里试试,我只在VS2010SP1中试过,因为这就是我的工作。如果你注意到一致性,也许你应该报告它。作为解决方法,您可以尝试以下方法:
Dim flag3 As Boolean = d1.Equals(d1)
Dim flag4 As Boolean = i2.Equals(i1)
或者这个:
Dim flag3 As Boolean = Nullable(Of DateTime).Equals(d1, d2)
Dim flag4 As Boolean = Nullable(Of Int32).Equals(i1, i2)
我个人更喜欢代码中的最后一个选项,即显式地说
Nullable(Of T)
,因为VB语言应该是冗长的,更像英语,即no:?|&&代码>构造(无意冒犯,C#devs)。有人能复制这个吗?也在VS2013中复制。问题似乎是,当您使用语言关键字作为类型名称时,它是可以使用的,但当您实际引用.NET framework类型名称时(隐式地,从系统
命名空间)。请注意类型高亮显示的不同方式。@Damien_不信者,我认为你是对的。我可以执行Single?.Equals(0.0!0.0!)
但不能执行System.Single?.Equals(0!0!)
。如果按SHift-F2键转到对象浏览器中的定义,Int32代码>带您到系统
,而整数
带您到可为空(T的)
。因此VS似乎以某种方式“看到”了它们的不同,或者说,?
的使用只得到了部分认可。我已经反复查看了VB语言规范好几次,我找不到在处理基元类型和其他值类型方面有什么不同之处。我刚刚在VS2010上遇到了这个bug,但是我尝试的是类似于如果(a?.b?.c?.d什么都不是)那么
,除了使用和之外,还有其他解决方法吗:如果(a什么都不是,b什么都不是…
等等。。。