【问题标题】:Cannot assign void to an implicitly-typed local variable with var and foreach无法使用 var 和 foreach 将 void 分配给隐式类型的局部变量
【发布时间】:2014-05-13 21:42:28
【问题描述】:

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

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

总是出错

不能将 void 分配给隐式类型的局部变量

如何绕过?

【问题讨论】:

  • 你不能这样做。在 v 上调用 foreach,而不是在构造对象上调用,因为 ForEach 返回 void,然后您尝试将 void 分配给变量

标签: c# foreach lambda var


【解决方案1】:

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

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

在您当前的代码中,您正在创建一个新的List&lt;Form1&gt;,然后遍历列表中的每个项目,但您没有返回任何内容。

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

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

【讨论】:

  • @tonni:不。您可以在成员使用之前使用括号进行分配,但不能初始化。
  • @habib 你的更新不起作用,但我明白你想说什么
  • @tonni,嗯,什么不起作用,它应该为您的List&lt;Form1&gt; 中的所有项目返回一个List&lt;Button&gt;,您是否收到任何错误/异常?
  • @Habib --- 不包括 linq,现在可以完美运行 :),谢谢帮助
【解决方案2】:

我怀疑你真的在寻找Where - 只是在ForEach 电话中调用Contains 对你没有任何帮助。同样,如果您对按钮感兴趣,我认为您并不是真的在寻找表单列表。我怀疑您可能正在寻找:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多