VB.Net没有智能感知的Lambda表达式

3
在VB.Net中使用lambda表达式会导致没有智能感知。这是VS2010的bug还是预期行为?请注意,C#中可以正常工作。
Return Array.TrueForAll(chequeColl, Function(x) x.Number <> "N") 'No intellisense Number does not appear


Return Array.TrueForAll(chequeColl, Function(x As MyClass) x.Number <> "N") 'Now casted intellisense appears

更新:这里有一个例子

Public Class Cheque

    Public Property Id As String
    Public Property Status As Byte
    Public Property Amount As String
    Public Property Number As String

End Class


Public Class ChequeCollection

    Private chequeColl() As Cheque

    Public Sub DoStuff()
        Array.TrueForAll(chequeColl, Function(x As Cheque) x.Number = 1) 'x has to be cast as cheque for intellisense to appear
    End Sub

End Class

2
通常在VB.Net中使用lambda表达式时会获得智能感知。您可以发布“chequeColl”的声明吗? - MarkJ
这是一个简单的类对象数组。 - Jon
@Jon,它们是什么类型的“对象”?如果它们不是MyClass,那就是你没有得到智能感知的原因。 - msarchet
当您使用List(Of Cheque)而不是数组时,是否会获得智能感知? - Philipp Grathwohl
它必须是一个数组。遗留代码 :-( - Jon
奇怪。我在VB 2008中使用等效代码时也没有智能感知(这里没有2010)。我不知道为什么。正如我所说,我通常在VB.Net中使用lambda表达式时会得到智能感知。例如,我可以像这样使用List(Of T)获得智能感知:Dim lst As List(Of Cheque): lst.TrueForAll(Function(x) x.Number = 1)。对于这个问题,有人知道答案吗?+1。 - MarkJ
1个回答

1

一个对象数组不像List(Of T)类一样强类型。因此,当您键入'x.'并期望Intellisese中出现“Number”时,它将不会出现。运行时不知道该数组中的对象类型。

如果您选择这样做,您可以使用LINQ将该数组转换为一个强类型的对象集合,然后Intellisense会显示。以下代码应该可以正常工作:

Dim ChequeList = (From c In MyArrayOfObjects Select c).ToList()

还有一个检查VB.NET与C# IntelliSense的事项。'Option Infer'必须打开。默认情况下是打开的,但对于升级的项目(即从05 -> 08 -> 10升级的项目)则不是。

为什么我的Lambda函数在运行时抛出System.MissingMemberException异常?
http://allen-conway-dotnet.blogspot.com/2010/09/why-are-my-lambda-functions-throwing.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接