Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot assign void to an implicitly-typed local variable with var and foreach

I'm trying to list all buttons name from my form to list with code

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

and always get error

Cannot assign void to an implicitly-typed local variable

How to bypass that?

like image 619
tonni Avatar asked Apr 02 '14 14:04

tonni


People also ask

How to declare implicitly typed variable C#?

Implicitly typed variables are those variables which are declared without specifying the . NET type explicitly. In implicitly typed variable, the type of the variable is automatically deduced at compile time by the compiler from the value used to initialize the variable.

How to declare a local variable in C#?

Local variables can be declared without giving an explicit type. The var keyword instructs the compiler to infer the type of the variable from the expression on the right side of the initialization statement.

Which of the following keyword is used to declare a variable whose type will be automatically determined by the compiler?

The auto keyword directs the compiler to use the initialization expression of a declared variable, or lambda expression parameter, to deduce its type.


2 Answers

Foreach returns void that is why you are getting the error. Your statement on the right hand side of assignment is not returning anything. You can do the same in two statements like:

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

In your current code you are creating a new List<Form1> and then iterating over each item in the list, but you are not returning anything.

As Jon Skeet has pointed out in the comment, it will not have any effect on the list. I guess you are trying to get all the button from your list of forms you can do:

var allButtons = v.SelectMany(r => r.Controls.OfType<Button>()).ToList();
like image 170
Habib Avatar answered Oct 01 '22 07:10

Habib


I suspect you're really looking for Where - just calling Contains in a ForEach call isn't going to do anything for you. Likewise I don't think you're really looking for a list of forms if you're interested in buttons. I suspect you may be looking for:

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

Note that this won't go into nested controls - if you need to do that, you'll need something recursive. (You may well be able to find other questions asking for that... it doesn't help that we don't know whether this is WinForms, WebForms, something else...)

like image 41
Jon Skeet Avatar answered Oct 01 '22 09:10

Jon Skeet