Lambda表达式和隐式类型

时间:2015-03-03 23:23:23

标签: vb.net lambda

好的,所以在花了最近几年的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”视为Object而不是ListViewItem,它是什么?我是否必须在我的lamda某处投射到listviewitem?看起来它应该知道item是ListViewItem,所以我不确定是怎么回事。

任何见解都将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

ListViewItemCollection未实现IEnumerable<ListViewItem>,因此LINQ函数中的item将不会被隐式输入(因此类型为Object)。

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

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

此外,如果上面的VB示例按原样编译,则您的项目有Option Strict Off,其中允许checkedItems隐式输入 - 作为{{1 }}

如果它没有编译(可能是因为项目设置为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)