我有Option Strict和Option Infer都设置为“On”。
此代码可以正常工作:
Dim tBoxes = From t In MainForm.Frame2.Controls.OfType(Of TextBox).ToList
tBoxes.ToList().ForEach(Sub(c) c.DataBindings.Clear())
为什么我不能将它们组合成下面的一行(我相信它与上面第一行没有将tBox设置为列表但仍然是IEnumberable这一事实相关,即使我调用“ToList”,为什么此?)
Dim tBoxes = From t In MainForm.Frame2.Controls.OfType(Of TextBox).ToList.ForEach(Sub(c) c.DataBindings.Clear())
这给出了“表达式不产生值”的错误
这似乎无关紧要,但这不仅仅是减少到一行,我想了解这里发生了什么。
VB.NET 2010
答案 0 :(得分:3)
问题不在于ToList
调用,而是List.ForEach Method,即Sub
,因此没有结果,也无法分配给变量。
如果您想使用一行,请删除Dim tBoxes =
。
更新实际上上述代码还有另一个问题。
Dim tBoxes = From t In MainForm.Frame2.Controls.OfType(Of TextBox).ToList
相当于
Dim tBoxList = MainForm.Frame2.Controls.OfType(Of TextBox).ToList
Dim tBoxes = From t in tBoxList
所以显然tBoxes
是IEnumerable<TextBox>
。
由于在这种情况下from t In ..
部分是不必要的,所以“oneliner”应该是这样的
MainForm.Frame2.Controls.OfType(Of TextBox).ToList.ForEach(Sub(c) c.DataBindings.Clear())
如果您确实需要查询部分,为了避免此类混淆,请不要忘记在调用(..)
或其他方法(ToList
,{{1}之前将其封在Count
中等等,像这样
Any
答案 1 :(得分:1)
小描述但足以理解
From t In MainForm.Frame2.Controls.OfType(Of TextBox) 'Filter all object of type text box
.ToList 'Convert IEnemerable(Of TextBox) to a IList type.
.ForEach(Sub(c) c.DataBindings.Clear())' Iterate through list and remove bindg of each text box
问题是.ForEach不返回任何值,因此没有任何内容可以分配您创建的tBoxes对象。它就像VB.net中的void方法或Sub。