【发布时间】:2015-08-26 05:19:52
【问题描述】:
方法语法会阻止隐式转换,但查询语法不会。 Option Strict 已开启。 如何在使用查询语法时强制显示错误?
整个(完全可运行)程序:
Option Strict On
Module Module1
Sub Main()
Dim custList As New List(Of Cust)()
custList.Add(New Cust() With {.Name = "Mr. Current", .Deleted = False})
custList.Add(New Cust() With {.Name = "Mrs. Deleted", .Deleted = True})
custList.Add(New Cust() With {.Name = "Miss Null", .Deleted = Nothing})
Dim QuerySyntax =
From c In custList
Where c.Deleted = False 'no error (the problem)
Dim MethodSyntax =
custList _
.Where(Function(c) c.Deleted = False) 'compiler error (desired effect)
For Each c As Cust In QuerySyntax
Console.WriteLine("Q: " & c.Name & " " & c.Deleted)
Next
For Each c As Cust In MethodSyntax
Console.WriteLine("M: " & c.Name & " " & c.Deleted)
Next
Console.ReadKey(True)
End Sub
Class Cust
Public Property Name() As String
Public Property Deleted() As System.Nullable(Of Boolean)
End Class
End Module
问题的关键所在:
Where c.Deleted = False 'no error
.Where(Function(c) c.Deleted = False) 'compiler error
【问题讨论】:
-
不是比较让编译器感到不安,而是将一个返回
Boolean?的 lambda 函数传递给一个接受返回Boolean的 lambda 的方法。在第一种情况下,没有函数传递,所以也没有错误。我怀疑你能解决这个问题。 -
我在这里可能有点离谱,但在第一种语法中,是否正在发生隐式装箱操作,使得编译器决定它不必识别隐式转换?也就是说,如果(由于某种原因)在“where c.Deleted = False”中有一个隐式框,则 Nullable 问题(对或错)被排除,因此没有编译器错误....
-
感谢@GSerg 的澄清,它看起来确实比较有效,但返回了
Boolean?我在这个简化的示例中查看了调试器:New Nullable(Of Boolean)(Nothing) = False并确认它返回了Boolean?False的值
标签: vb.net linq implicit-conversion linq-query-syntax linq-method-syntax