VB.NET - 可空日期时间和三元运算符

发布于 2024-10-02 10:30:34 字数 766 浏览 10 评论 0原文

我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风为裳 2024-10-09 10:30:35

我承认我不是这方面的专家,但显然它源于两件事:

  1. If 三元运算符只能返回一种类型,在本例中是日期类型,而不是可为空的日期类型
  2. VB.Net 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:

  1. The If ternary operator can return only one type, in this case a date type, not a nullable date type
  2. The VB.Net Nothing value is not actually null 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.

绻影浮沉 2024-10-09 10:30:34

鲍勃·麦克是正确的。请特别注意他的第二点 - C# 中并非如此。

您需要做的是通过将 Nothing 强制转换为可为空的 DateTime,如下所示:

gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), CType(Nothing, DateTime?), DateTime.Parse(LastCalibrationDateTextBox.Text))

这是一个要演示的代码片段:

Dim myDate As DateTime?
' try with the empty string, then try with DateTime.Now.ToString '
Dim input = ""
myDate = If(String.IsNullOrEmpty(input), CType(Nothing, DateTime?), DateTime.Parse(input))
Console.WriteLine(myDate)

除了转换之外,您还可以声明一个新的可为空: 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:

gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), CType(Nothing, DateTime?), DateTime.Parse(LastCalibrationDateTextBox.Text))

Here is a snippet to demonstrate:

Dim myDate As DateTime?
' try with the empty string, then try with DateTime.Now.ToString '
Dim input = ""
myDate = If(String.IsNullOrEmpty(input), CType(Nothing, DateTime?), DateTime.Parse(input))
Console.WriteLine(myDate)

Instead of casting you can also declare a new nullable: New Nullable(Of DateTime) or New DateTime?(). The latter format looks a little odd but it's valid.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文