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

18
我正在尝试列出表单中所有按钮的名称以及它们对应的代码。
var v = new List<Form1>() { this }.ForEach(x => { x.GetType().Name.Contains(typeof(Button).Name); });

并且总是出现错误

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

如何绕过这个问题?


1
你不能这样做。在 v 上调用 foreach,而不是在构造的对象上调用,因为 ForEach 返回 void,然后你尝试将 void 赋值给变量。 - Samuel
3个回答

27

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
@tonni:不行。在成员使用之前,你可以在赋值之前使用括号进行排序,但不能进行初始化。 - Ben Voigt
@habib,你的更新没有生效,但我理解你想要表达的意思。 - tonni
@tonni,嗯,什么不起作用,它应该为您的List<Form1>中的所有项目返回一个List<Button>,您是否遇到任何错误/异常? - Habib
@Habib --- 没有包含linq,现在完美工作了:), 感谢您的帮助。 - tonni

8

我猜你真正想要的是Where - 在ForEach中调用Contains不会为你做任何事情。同样,如果你对按钮感兴趣,那么你并不是真正要寻找表单列表。我猜你可能正在寻找:

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

请注意,这不会进入嵌套控件 - 如果您需要这样做,您需要递归处理。 (您很可能能够找到其他要求此操作的问题...我们不知道这是WinForms,WebForms还是其他什么...)

0

这是我之前遇到的错误的正确代码格式。

public asyncTask<IDataResult<IEnumerable<PatientSpecialInstructionDto>>> Handle(GetPatientSpecialInstructionListQuery request, CancellationToken cancellationToken)
{
var dataList = await _patientSpecialInstructionRepository.GetPatientSpecialInstructionListQuery(request.ProviderId);
                
 return new PagedDataResult<IEnumerable<PatientSpecialInstructionDto>>(dataList, dataList.Count(), request.PageNumber);
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接