「DateTime」が「何もない」かどうかを確認できないのはなぜですか?
質問
vb.netでは、 DateTime
「設定しない」変数?そして、なぜ設定することができるのか DateTime
に Nothing
, 、 しかし いいえ それがあるかどうかを確認することができます Nothing
?例えば:
Dim d As DateTime = Nothing
Dim boolNotSet As Boolean = d Is Nothing
2番目のステートメントは、このエラーをスローします。
'Is' operator does not accept operands of type 'Date'. Operands must be reference or
nullable types.
解決
これは、VB.NET、IMOとの最大の混乱の原因の1つです。
Nothing
VB.NETでは、に相当します default(T)
C#:指定されたタイプのデフォルト値。
- 値タイプの場合、これは本質的に「ゼロ」に相当します。
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 = d.HasValue
より包括的な説明があります アンソニーD.グリーンのブログ
他のヒント
DateTimeは値タイプであるため、nullにできない理由です。あなたはそれが等しいことを確認できます DateTime.MinValue
, 、または使用することができます Nullable(Of DateTime)
代わりは。
VBは、「役に立つ」ことがあることがあります。日付を何にも設定できるようにすると、実際に他の価値、おそらくミンバルに設定しています。
見る この質問 価値タイプと参照タイプの広範な議論のため。
DateTimeはaです 値タイプ, 、つまり、常にある程度の価値があることを意味します。
それは整数のようなものです - それは0、または1、またはゼロ未満である可能性がありますが、決して「何もない」ことはできません。
価値を何も受け取らないデータタイムが必要な場合は、めまい性のデータタイムを使用してください。
Nullableの作業に関するいくつかの例 DateTime
値。
(見る Nullable Valueタイプ(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]
また、変数が ヌル (から 何もない(ビジュアルベーシック)):
参照(またはnullable値タイプ)変数があるかどうかを確認するとき ヌル, 、 使用禁止= Nothing
また<> Nothing
. 。常に使用してくださいIs Nothing
またIsNot Nothing
.
プログラミング言語では、ヌルを使用する場合は注意してください。上記の例は、別の問題を示しています。 nullableのタイプを使用する場合、そのタイプからインスタンス化された変数が値system.dbnull.valueを保持できることを意味します。 「= Nothing」を使用して値をデフォルトに設定するという解釈が変更されたわけではなく、値のオブジェクトがnull参照をサポートできるようになったということではありません。ただの警告...幸せなコーディング!
値タイプを含む個別のクラスを作成できます。このようなクラスから作成されたオブジェクトは、何も割り当てられない参照タイプです。例:
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変数がnullかどうかを確認します。
以下のようにこれを確認できます。
if varDate = "#01/01/0001#" then
' blank date. do something.
else
' Date is not blank. Do some other thing
end if
これを回避する方法は、代わりにオブジェクトデータタイプを使用することです。
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