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)
好的,在过去几年用 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)