当前位置:  开发笔记 > 编程语言 > 正文

VB.NET没什么日期时间?DataReader的

如何解决《VB.NET没什么日期时间?DataReader的》经验,为你挑选了1个好方法。

一个简单的问题,if inline:dim mydate as datetime?


'版本1(工作!)

If dtReader.IsDBNull(dtReader.GetOrdinal("mydate")) Then
    mydate = Nothing
Else
    mydate = dtReader.GetDateTime(dtReader.GetOrdinal("mydate"))
End If

价值=没有


'版本2(DOENSN'T WORK!)

mydate = If(dtReader.IsDBNull(dtReader.GetOrdinal("mydate")), Nothing, dtReader.GetDateTime(dtReader.GetOrdinal("mydate")))

价值=#12:00:00#


有人可以解释为什么版本2获得此值吗?



1> Damien_The_U..:

这归结为编译器必须对其进行类型分析If.请记住,Nothing这与C#的null不同,它更接近default(T):

如果变量的值类型不可为空,则为其赋值为Nothing将其设置为其声明类型的默认值

现在,当编译器正在分析时If,它必须决定整个表达式的类型.这是它正在看的东西:

If(Boolean,,DateTime)

现在,它必须根据第二个和第三个参数的类型来决定表达式的类型,并且必须选择其中一个类型.所以,很自然地,它选择了DateTime.和一个Nothing转换为DateTime相同的最小值.

要更改此设置,请选择推断类型DateTime?:

mydate = If(dtReader.IsDBNull(dtReader.GetOrdinal("mydate")), _
          CType(Nothing,DateTime?), _
          dtReader.GetDateTime(dtReader.GetOrdinal("mydate")))

根据Visual Basic语言规范,第11.22节(条件表达式):

如果提供了三个操作数,则必须将所有三个表达式分类为值,并且第一个操作数必须是布尔表达式.如果结果是表达式为true,那么第二个表达式将是运算符的结果,否则第三个表达式将是运算符的结果.表达式的结果类型是第二个和第三个表达式的类型之间的主导类型.如果没有显性类型,则发生编译时错误.

(我强调).

请注意,没有条件文本关于"如果在赋值语句中使用它,您还可以考虑所分配的变量的声明类型".

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有