Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net '';此处不能使用字符_Vb.net_Visual Studio 2010_.net 4.0_Nullable - Fatal编程技术网

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什么都不是…
等等。。。