VB.NET - 可空日期时间和三元运算符
我在 VB.NET (VS 2010) 中遇到了 Nullable DateTime 问题。
方法 1
If String.IsNullOrEmpty(LastCalibrationDateTextBox.Text) Then
gauge.LastCalibrationDate = Nothing
Else
gauge.LastCalibrationDate = DateTime.Parse(LastCalibrationDateTextBox.Text)
End If
方法 2
gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), Nothing, DateTime.Parse(LastCalibrationDateTextBox.Text))
当给定空字符串时,方法 1 向 gauge.LastCalibrationDate 分配 Null(无)值,但方法 2 向其分配 DateTime.MinValue。
在我的代码中的其他地方,我有:
LastCalibrationDate = If(IsDBNull(dr("LastCalibrationDate")), Nothing, dr("LastCalibrationDate"))
这正确地将三元运算符中的 Null(无)分配给可空日期时间。
我缺少什么?谢谢!
I'm having problems with a Nullable DateTime in VB.NET (VS 2010).
Method 1
If String.IsNullOrEmpty(LastCalibrationDateTextBox.Text) Then
gauge.LastCalibrationDate = Nothing
Else
gauge.LastCalibrationDate = DateTime.Parse(LastCalibrationDateTextBox.Text)
End If
Method 2
gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), Nothing, DateTime.Parse(LastCalibrationDateTextBox.Text))
When given an empty string Method 1 assigns a Null (Nothing) value to gauge.LastCalibrationDate but Method 2 assigns it the DateTime.MinValue.
In other places in my code I have:
LastCalibrationDate = If(IsDBNull(dr("LastCalibrationDate")), Nothing, dr("LastCalibrationDate"))
This correctly assigns Null (Nothing) from a Ternary Operator to a Nullable DateTime.
What am I missing? Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我承认我不是这方面的专家,但显然它源于两件事:
If
三元运算符只能返回一种类型,在本例中是日期类型,而不是可为空的日期类型Nothing
值实际上并不是null
,而是相当于指定类型的默认值,在本例中是日期,而不是可以为 null 的日期。因此是日期最小值。我从这篇文章中得出了这个答案的大部分信息: 三元运算符 VB 与 C#:为什么解析为整数而不是整数?
希望这会有所帮助,并且像 Joel Coehoorn 这样的人可以对这个主题有更多的了解。
I will admit that I'm not an expert on this, but apparently it stems from two things:
If
ternary operator can return only one type, in this case a date type, not a nullable date typeNothing
value is not actuallynull
but is equivalent to the default value of the specified type, in this case a date, not a nullable date. Hence the date minimum value.I derived most of the information for this answer from this SO post: Ternary operator VB vs C#: why resolves to integer and not integer?
Hope this helps and that someone like Joel Coehoorn can shed more light on the subject.
鲍勃·麦克是正确的。请特别注意他的第二点 - C# 中并非如此。
您需要做的是通过将
Nothing
强制转换为可为空的 DateTime,如下所示:这是一个要演示的代码片段:
除了转换之外,您还可以声明一个新的可为空:
New Nullable(Of DateTime)
或新 DateTime?()
。后一种格式看起来有点奇怪,但它是有效的。Bob Mc is correct. Pay extra attention to his second point - this isn't the case in C#.
What you need to do is force
Nothing
to a nullable DateTime by casting it as follows:Here is a snippet to demonstrate:
Instead of casting you can also declare a new nullable:
New Nullable(Of DateTime)
orNew DateTime?()
. The latter format looks a little odd but it's valid.