导入System.Linq解决了“Class not be indexed”错误

时间:2015-06-29 03:17:13

标签: vb.net linq

我有以下代码无法编译:

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命名空间会解决该特定错误?它似乎不应该。

1 个答案:

答案 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   编译时错误将会发生。