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

在VB.NET中,有没有办法将DateTimevariables设置为“not set”? 为什么可以将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.Net,IMO混淆的最大来源之一。

VB.Net中Nothing等同于C#中的默认值default(T) :给定types的默认值。

  • 对于值types,这本质上等价于“零”: 0表示IntegerFalse表示BooleanDateTime.MinValue表示DateTime ,…
  • 对于引用types,它是null值(引用的引用,没有什么)。

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

解决scheme:正如其他人所说的

  • 要么使用DateTime? (即Nullable(Of DateTime) )。 这是我首选的解决scheme。
  • 或者使用d = DateTime.MinValue或等价的d = Nothing

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

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

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

VB有时候“有帮助”会让你觉得它做的事情不是。 当它让你设置date为无,它真的把它设置为其他值,也许MinValue。

看到这个问题的值types与参考types的广泛讨论。

处理可空的DateTime值的一些例子。

(有关更多信息,请参见可空值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] 

另外,关于如何检查variables是否为null (来自Nothing(Visual Basic) ):

当检查一个引用(或可为null的值types)variables是否为空时 ,不要使用= Nothing<> Nothing 。 总是使用Is Nothing或“ IsNot Nothing

DateTime是一个值types ,这意味着它总是有一定的价值。

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

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

在任何编程语言中,使用空值时要小心。 上面的例子显示了另一个问题。 如果使用Nullabletypes,则表示从该types实例化的variables可以保存值System.DBNull.Value; 不是它已经改变了使用“= Nothing”将值设置为默认的解释,或者值的对象现在可以支持空引用。 只是一个警告…快乐的编码!

您可以创build一个包含值types的单独的类。 从这样的类创build的对象将是一个引用types,可以被赋值为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 

末class

在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 

然后,你可以select和重写,使其做你所需要的。 很多工作 – 但如果你真的需要它,你可以做到。

你也可以用下面的简单来检查:

 If startDate <> Nothing Then your logic End If 

它将检查DateTime数据types的startDatevariables是否为null。

解决这个问题的方法是使用Object数据types。

 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 

那么你可以把date设置为这样:

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