Lambda 表达式和隐式类型

Lambda expressions and implicit typing

好的,在过去几年用 C# 编写代码后,我现在找到了一份新工作并使用 VB.net。我想弄清楚如何编写 lambda 表达式,我想我已经弄明白了,例如:

在 C# 中我可以写

var checkedItems = lvwCharges.Items.Where(item => item.Checked)

在 VB.Net 中会是:

Dim checkedItems = lvwCharges.Items.Where(Function(item) item.Checked)

所以,我想我已经理解语法了,但我的问题是为什么 VB.Net 将 "item" 视为对象而不是 ListViewItem,它是什么?我必须在我的 lamda 中的某个地方投射到 listviewitem 吗?它似乎应该知道该项目是一个 ListViewItem 所以我不确定发生了什么。

如有任何见解,我们将不胜感激!

谢谢!

ListViewItemCollection 没有实现 IEnumerable<ListViewItem>,因此 LINQ 函数中的 item 不会被隐式类型化(因此将是 Object 类型)。

这很容易修复。 在尝试使用任何 lambda 表达式之前,只需转换 Items 集合:

var checkedItems = lvwCharges.Items.Cast<ListViewItem>().Where(item => item.Checked);

此外,如果上面的 VB 示例按原样编译,您的项目有 Option Strict Off 允许 checkedItems隐式输入——作为 IEnumerable(Of ListViewItem).

如果编译不通过(可能是因为项目是用Option Strict On设置的)你需要指定checkedItems的类型,而不是item的类型;因为它现在是从 Cast(Of T).

的结果中隐式键入的
Dim checkedItems As IEnumerable(Of ListViewItem) = ...

就是说,没有什么可以阻止您使用任一语言明确指定 item 的类型:

var checkedItems = lvwCharges.Items
    .Cast<ListViewItem>()
    .Where((ListViewItem item) => item.Checked)

Dim checkedItems = lvwCharges.Items _
    .Cast(Of ListViewItem)() _
    .Where(Function(item As ListViewItem) item.Checked)