为什么我不能检查'DateTime'是否'没什么'?

时间:2011-05-03 12:48:00

标签: vb.net datetime null nullable nothing

在VB.NET中,有没有办法将DateTime变量设置为“未设置”?为什么可以将DateTime设置为Nothing,但可以检查它是否为Nothing?例如:

Dim d As DateTime = Nothing
Dim boolNotSet As Boolean = d Is Nothing 

第二个语句抛出此错误:

'Is' operator does not accept operands of type 'Date'. Operands must be reference or
nullable types.

8 个答案:

答案 0 :(得分:130)

这是与VB.Net,IMO混淆的最大原因之一。

VB.Net中的

Nothing相当于C#中的default(T):给定类型的默认值。

  • 对于值类型,这基本上相当于“零”:0IntegerFalseBoolean,{{1}为DateTime.MinValue ,},
  • 对于参考类型,它是DateTime值(引用的引用,没有任何内容)。

语句null因此等同于d Is Nothing,显然无法编译。

解决方案:正如其他人所说的那样

  • 使用d Is DateTime.MinValue(即DateTime?)。这是我的首选解决方案。
  • 或使用Nullable(Of DateTime)或等效d = DateTime.MinValue

在原始代码的上下文中,您可以使用:

d = Nothing

可以在Anthony D. Green's blog

上找到更全面的解释

答案 1 :(得分:10)

DateTime是一种值类型,这就是它不能为空的原因。您可以检查它是否等于DateTime.MinValue,或者您可以使用Nullable(Of DateTime)代替。

VB有时“有帮助”会让你认为它正在做一些事情。当它允许你将Date设置为Nothing时,它实际上将它设置为其他值,可能是MinValue。

有关值类型与参考类型的广泛讨论,请参阅this question

答案 2 :(得分:3)

DateTime是值类型,这意味着它总是有一些值。

它就像一个整数 - 它可以是0,或1,或小于零,但它永远不会是“无”。

如果你想要一个可以取Nothing值的DateTime,请使用Nullable DateTime。

答案 3 :(得分:3)

使用可空DateTime值的一些示例。

(有关详情,请参阅Nullable Value Types (Visual Basic)。)

'
' An ordinary DateTime declaration. It is *not* nullable. Setting it to
' 'Nothing' actually results in a non-null value.
'
Dim d1 As DateTime = Nothing
Console.WriteLine(String.Format("d1 = [{0}]\n", d1))
' Output:  d1 = [1/1/0001 12:00:00 AM]

' Console.WriteLine(String.Format("d1 is Nothing? [{0}]\n", (d1 Is Nothing)))
'
'   Compilation error on above expression '(d1 Is Nothing)':
'
'      'Is' operator does not accept operands of type 'Date'.
'       Operands must be reference or nullable types.

'
' Three different but equivalent ways to declare a DateTime
' nullable:
'
Dim d2? As DateTime = Nothing
Console.WriteLine(String.Format("d2 = [{0}][{1}]\n", d2, (d2 Is Nothing)))
' Output:  d2 = [][True]

Dim d3 As DateTime? = Nothing
Console.WriteLine(String.Format("d3 = [{0}][{1}]\n", d3, (d3 Is Nothing)))
' Output:  d3 = [][True]

Dim d4 As Nullable(Of DateTime) = Nothing
Console.WriteLine(String.Format("d4 = [{0}][{1}]\n", d4, (d4 Is Nothing)))
' Output:  d4 = [][True]

此外,关于如何检查变量 null (来自Nothing (Visual Basic)):

检查引用(或可空值类型)变量是否为 null 时,请勿使用= Nothing<> Nothing。始终使用Is NothingIsNot Nothing

答案 4 :(得分:1)

在任何编程语言中,使用Null时要小心。上面的例子显示了另一个问题。如果使用Nullable类型,则意味着从该类型实例化的变量可以保存值System.DBNull.Value;并没有改变使用“= Nothing”将值设置为默认值的解释,或者值的Object现在可以支持空引用。只是一个警告......快乐的编码!

您可以创建一个包含值类型的单独类。从这样的类创建的对象将是引用类型,可以为其指定Nothing。一个例子:

Public Class DateTimeNullable
Private _value As DateTime

'properties
Public Property Value() As DateTime
    Get
        Return _value
    End Get
    Set(ByVal value As DateTime)
        _value = value
    End Set
End Property

'constructors
Public Sub New()
    Value = DateTime.MinValue
End Sub

Public Sub New(ByVal dt As DateTime)
    Value = dt
End Sub

'overridables
Public Overrides Function ToString() As String
    Return Value.ToString()
End Function

结束班

Main()中的

        Dim dtn As DateTimeNullable = Nothing
    Dim strTest1 As String = "Falied"
    Dim strTest2 As String = "Failed"
    If dtn Is Nothing Then strTest1 = "Succeeded"

    dtn = New DateTimeNullable(DateTime.Now)
    If dtn Is Nothing Then strTest2 = "Succeeded"

    Console.WriteLine("test1: " & strTest1)
    Console.WriteLine("test2: " & strTest2)
    Console.WriteLine(".ToString() = " & dtn.ToString())
    Console.WriteLine(".Value.ToString() = " & dtn.Value.ToString())

    Console.ReadKey()

    ' Output:
    'test1:  Succeeded()
    'test2:  Failed()
    '.ToString() = 4/10/2012 11:28:10 AM
    '.Value.ToString() = 4/10/2012 11:28:10 AM

然后你可以挑选并选择可覆盖的东西,让它做你需要的。很多工作 - 但如果你真的需要它,你可以做到。

答案 5 :(得分:1)

您也可以使用以下简单的方法来检查:

If startDate <> Nothing Then
your logic
End If

它将检查DateTime数据类型的startDate变量是否为null。

答案 6 :(得分:0)

解决这个问题的方法是使用Object数据类型:

Private _myDate As Object
Private Property MyDate As Date
    Get
        If IsNothing(_myDate) Then Return Nothing
        Return CDate(_myDate)
    End Get
    Set(value As Date)
        If date = Nothing Then
            _myDate = Nothing
            Return
        End If
        _myDate = value
     End Set
End Property

然后你可以将日期设置为:

MyDate = Nothing
Dim theDate As Date = MyDate
If theDate = Nothing Then
    'date is nothing
End If

答案 7 :(得分:0)

您可以查看以下内容:

if varDate = "#01/01/0001#" then
       '  blank date. do something.
else
       ' Date is not blank. Do some other thing
end if