为什么我无法检查"日期时间"是否为"无"?



在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.

这是VB最大的混淆来源之一。净,国际海事组织。

Nothing在VB。Net相当于c#中的default:给定类型的默认值。

  • 对于值类型,这基本上相当于' 0 ':0用于Integer, False用于Boolean, DateTime.MinValue用于DateTime,…
  • 对于引用类型,它是null值(一个引用,好吧,什么都没有)。

语句d Is Nothing因此等同于d Is DateTime.MinValue,显然不能编译。

解决方案:如其他人所说

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

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

Dim d As DateTime? = Nothing
Dim boolNotSet As Boolean = Not d.HasValue

更全面的解释可以在Anthony D. Green的博客

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

VB有时"有用地"让你认为它在做一些它没有做的事情。当它让你设置日期为0时,它实际上是将它设置为其他值,可能是MinValue。

关于值类型和引用类型的详细讨论,请参见此问题。

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

它就像一个整数——它可以是0、1或小于0,但它永远不可能是"无"。

如果你想要一个DateTime可以接受值Nothing,使用一个Nullable DateTime

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

(更多信息请参见可空值类型(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 (from Nothing (Visual Basic)):
当检查引用(或可空值类型)变量是否为null时,不要使用= Nothing<> Nothing。始终使用Is NothingIsNot Nothing

在任何编程语言中,使用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

然后你可以选择可重写的,使它做你需要的。很多工作,但如果你真的需要,你可以做到。

您也可以使用下面的简单代码进行检查:

If startDate <> Nothing Then
your logic
End If

检查DateTime数据类型的startDate变量是否为空

你可以这样检查:

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

解决这个问题的方法是使用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

相关内容

  • 没有找到相关文章

最新更新