Control.Invoke and anonymous methods

  • Thread starter Thread starter Lee Crabtree
  • Start date Start date
L

Lee Crabtree

I'm a little confused about using Control.Invoke with an anonymous
method. It seems like the compiler is able to generate whatever glue
code is necessary to turn an anonymous method into a delegate type in
several situations, such as starting a thread:

Thread workerThread = new Thread(delegate { MessageBox.Show("Hello!"); });

However, trying to do the same thing with a form, as in:

Form1.Invoke(delegate { MessageBox.Show("Hello!"); });

nets an error stating that an anonymous method is not a delegate type,
and can't be converted. It's easy enough to wrap the anonymous method
in a MethodInvoker or whatever other required delegate type, but I don't
really understand why the difference exists at all.

Lee Crabtree
 
I'm a little confused about using Control.Invoke with an anonymous
method. It seems like the compiler is able to generate whatever glue
code is necessary to turn an anonymous method into a delegate type in
several situations, such as starting a thread:

Thread workerThread = new Thread(delegate { MessageBox.Show("Hello!"); });

However, trying to do the same thing with a form, as in:

Form1.Invoke(delegate { MessageBox.Show("Hello!"); });

nets an error stating that an anonymous method is not a delegate type,
and can't be converted. It's easy enough to wrap the anonymous method
in a MethodInvoker or whatever other required delegate type, but I don't
really understand why the difference exists at all.

The Thread ctor accepts a specific type of delegate (ThreadStart). If
your anonymous method matches the signature of the delegate, the
compiler can do the work of inferring the type.

But Control.Invoke accepts any Delegate-derived type. The signature for
your anonymous method (void return type and no parameters) could match
any number of Delegate-derived types. Which one should the compiler
use? There's no way to infer that automatically.
 
Back
Top