Last week I was trying to pass a lambda as a parameter to a method that expected a delegate. However doing this resulted in the following compiler error
“Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type.”
1: public void CreateAndExecuteLambda()
2: {
3: //Does not compile
4: InvokeDelegate(() => MessageBox.Show("Hello World"));
5: }
6:
7: public void InvokeDelegate(Delegate @delegate)
8: {
9: @delegate.DynamicInvoke();
10: }
At first I found this very strange, if I remembered it well a lambda expression is just a new syntax for anonymous methods and anonymous methods are nothing more than inline delegates. So why the compiler does not agree?
The reason is that a lambda expression can either be converted to a delegate type or an expression tree - but it has to know which delegate type. Just knowing the signature isn't enough. For instance, suppose I have:
1: public delegate void Action1();
2: public delegate void Action2();
3:
4: Delegate x = () => Console.WriteLine("hello world");
What would you expect the concrete type of the object referred to by x
to be?
If you want to make it work you have to help the compiler by explicitly casting the lambda expression to the correct delegate type.
1: public void CreateAndExecuteLambda()
2: {
3: //This works!
4: InvokeDelegate((Action)(() => MessageBox.Show("Hello World")));
5: }
6:
7: public void InvokeDelegate(Delegate @delegate)
8: {
9: @delegate.DynamicInvoke();
10: }