質問

vb.netでは、 DateTime 「設定しない」変数?そして、なぜ設定することができるのか DateTimeNothing, 、 しかし いいえ それがあるかどうかを確認することができます 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top