0

Nullable object must have a value今日、このコード行でエラーが発生しました。

list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate

面白いことに、これは以前は正常に機能していたと思います(そして、基になるデータには常にnull値が散在しています)。そして論理的にはそれは私にはうまく見えます。ヌルの危険から私たちを守ってくれるかのようにチェックしHasValueAndAlso 見てください。

しかし、突然そうではないようです。私は何かが足りないのですか?

OK、これに修正できます。これにより、エラーがなくなります。

list = From x In Me Where If(x.FooDate.HasValue, x.FooDate.Value.Date >= barDate,False)

しかし、これは私には読みにくいように見えます。何かご意見は?

更新...と告白
上記のコードを単純化して行を短くする際に、コードの重要なチャンクを省略しました。元の問題は次のようになっているはずです。

list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= fromDate And x.FooDate.Value.Date <= toDate

短絡と演算子の優先順位の規則のために(私自身のずっと前の質問への回答で概説されているように)、LINQが2番目を評価するのを止めるために、命令の2番目の部分を角かっこで囲む必要がありましたx.FooDate.Value.Date

list = From x In Me Where x.FooDate.HasValue AndAlso (x.FooDate.Value.Date >= fromDate and x.FooDate.Value.Date <= toDate)

LINQが実際にAndAlsoに準拠していることを確認するためのクイックテストコードをスローしてくれた両方の回答に感謝し、元の問題をより詳しく調べるように強制します。

4

2 に答える 2

1

それはうまくいくはずです。私はこのコードを書きましたが、 にbarDate設定しても問題なく動作しますNothing

Sub Main()

    Dim barDate As Nullable(Of DateTime) = Nothing

    Dim List = From x In GetDates() Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date > barDate

    Console.WriteLine(List.Count())

End Sub

Function GetDates() As List(Of Foo)
    Dim l = New List(Of Foo)
    l.Add(New Foo With {.FooDate = DateTime.Now})
    l.Add(New Foo)
    Return l
End Function

Class Foo
    Private m_fooDate As DateTime?
    Public Property FooDate() As DateTime?
        Get
            Return m_fooDate
        End Get
        Set(ByVal value As DateTime?)
            m_fooDate = value
        End Set
    End Property

End Class
于 2012-01-05T18:02:28.337 に答える
1

あなたのクエリは安全だと確信しています。少なくとも次のサンプル コードは次のとおりです。

Dim dateList As New List(Of Nullable(Of Date))
For i As Int32 = 0 To 12
    If (i Mod 3 = 0) Then
        dateList.Add(Nothing)
    Else
        dateList.Add(New Date(2012, i, 1))
    End If
Next
Dim july = New Date(2012, 7, 1)
Dim fromJuly = (From m In dateList
      Where m.HasValue AndAlso m.Value.Date >= july).ToList

注: i を i に置き換えるAndAlsoAnd、例外が発生します。

したがって、問題は別の場所にあるはずです。あなたのクラスをもっと見せてください。

于 2012-01-05T17:49:42.477 に答える