LINQ是否在VB.NET中进行短路评估?

LINQ是否在VB.NET中进行短路评估?,vb.net,linq,null,short-circuiting,Vb.net,Linq,Null,Short Circuiting,我们有一个可为null的对象今天在这行代码上必须有一个值错误: list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate 有趣的是,我确信这种方法可以很好地工作(并且在底层数据中总是有少量的空值)。从逻辑上讲,我觉得不错。检查HasValue和AndAlso似乎可以保护我们免受任何零危险 但似乎突然之间他们不是。我错过什么了吗 好的,我们可以纠正它,这样就消除了错误: list

我们有一个
可为null的对象今天在这行代码上必须有一个值
错误:

list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate
有趣的是,我确信这种方法可以很好地工作(并且在底层数据中总是有少量的空值)。从逻辑上讲,我觉得不错。检查
HasValue
AndAlso
似乎可以保护我们免受任何零危险

但似乎突然之间他们不是。我错过什么了吗

好的,我们可以纠正它,这样就消除了错误:

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是否真的遵守了AndAlso,并迫使我更仔细地研究原始问题。

我非常确定您的查询是安全的,至少以下示例代码是:

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
注意:如果我将
替换为
,我将得到您的异常


所以问题一定在别的地方。请给我们看更多你的课。

应该有用。我写了这段代码,它对我来说很好,即使
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

您能用示例数据重现它并向我们展示这段代码吗?这是LINQ到对象,还是您在使用其他LINQ提供程序?另外,您可以包括整个LINQ查询吗?您似乎至少缺少了Select部分这是LINQ到SQL,还是我返回了一些奇怪的东西(例如,这不是IEnumerable)?@TimSchmelter刚刚回到这里,我看到您提供了一个简化的示例,所以我将尝试您的。。。感谢这是我猜的LINQ to对象(我使用过的唯一一种),其中我是一个绑定列表(Foo)。我运行了你的代码,得到了与你相同的结果,所以你是对的,问题一定在别处。我会继续digging@hawbsl:与其在第二个条件中添加括号,不如简单地使用
而不是
?还是我误解了“操作员优先级”问题?
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