我有以下代码无法编译:
Dim ContentSent As HashSet(Of String) = New HashSet(Of String)(SubscriberContent.ContentIdSent.Split(","))
content = New Content
' The next line causes causing the error
content = contentCollection.Find(Function(x) x.CntId = Convert.ToInt32(ContentSent(0)))
它得到的错误是:
Class无法编入索引,因为它没有默认属性
这是有道理的。奇怪的是,当我导入System.Linq
时,编译错误消失了。
对于一个更简单的示例,此代码会收到错误:
Imports System
Imports System.Collections.Generic
Module MyModule
Public Sub Main()
Dim x As IEnumerable(Of Integer) = {0, 1, 2, 3}
Dim item As Integer = x(3) ' Gets error on this line
Console.WriteLine(item)
End Sub
End Module
但这有效:
Imports System
Imports System.Collections.Generic
Imports System.Linq ' This is the only difference!
Module MyModule
Public Sub Main()
Dim x As IEnumerable(Of Integer) = {0, 1, 2, 3}
Dim item As Integer = x(3)
Console.WriteLine(item) ' Outputs "3"
End Sub
End Module
为什么导入System.Linq
命名空间会解决该特定错误?它似乎不应该。
答案 0 :(得分:1)
可能违规项目是:ContentSent(0)
一旦你导入System.Linq,VB就会自动使用扩展方法ElementAtOrDefault作为"伪默认值" ContentSent的索引器。
如果你在索引上退格并观察Intellisense显示,你可以自己看看。
@ StevenDoggart的评论促使我重新审视这个问题。 VB的这种行为在Visual Basic Language Specification中指定。
这个特殊的VB功能称为Default Query Indexer。
默认查询索引器
每个可查询的集合类型,其元素类型为T而不是 已经有一个默认属性被认为有默认值 以下一般形式的财产:
Public ReadOnly Default Property Item(index As Integer) As T Get Return Me.ElementAtOrDefault(index) End Get End Property
默认属性只能使用默认值引用 属性访问语法;默认属性不能被引用 名称。例如:
Dim customers As IEnumerable(Of Customer) = ... Dim customerThree = customers(2) ' Error, no such property Dim customerFour = customers.Item(4)
如果集合类型没有ElementAtOrDefault成员,则a 编译时错误将会发生。