无法使用var和foreach将void分配给隐式类型的局部变量

时间:2014-04-02 14:16:02

标签: c# foreach lambda var

我试图列出我的表单中的所有按钮名称以列出代码

var v = new List<Form1>() { this }.ForEach(x => { x.GetType().Name.Contains(typeof(Button).Name); });

并始终收到错误

  

无法将void分配给隐式类型的局部变量

如何绕过它?

2 个答案:

答案 0 :(得分:14)

Foreach会返回void,这就是您收到错误的原因。您在作业右侧的陈述不会返回任何内容。您可以在两个语句中执行相同的操作,例如:

var v = new List<Form1>() { this };
v.ForEach(x => { x.GetType().Name.Contains(typeof(Button).Name); });

在您当前的代码中,您正在创建一个新的List<Form1>,然后迭代列表中的每个项目,但您没有返回任何内容。

正如Jon Skeet在评论中指出的那样,它不会对名单产生任何影响。我想您正试图从您可以执行的表单列表中获取所有按钮:

var allButtons = v.SelectMany(r => r.Controls.OfType<Button>()).ToList();

答案 1 :(得分:5)

我怀疑你真的在寻找Where - 只是在Contains来电中致电ForEach并不会为你做任何事情。同样,如果您对按钮感兴趣,我也不会认为您正在寻找表单的列表。我怀疑你可能在寻找:

var buttons = this.Controls.OfType<Button>().ToList();

请注意,这不会进入嵌套控件 - 如果你需要这样做,你需要一些递归的东西。 (你很可能会找到其他问题......我们不知道这是不是WinForms,WebForms,还是别的......)