Skip to main content

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type

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:  }

Popular posts from this blog

Podman– Command execution failed with exit code 125

After updating WSL on one of the developer machines, Podman failed to work. When we took a look through Podman Desktop, we noticed that Podman had stopped running and returned the following error message: Error: Command execution failed with exit code 125 Here are the steps we tried to fix the issue: We started by running podman info to get some extra details on what could be wrong: >podman info OS: windows/amd64 provider: wsl version: 5.3.1 Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM Error: unable to connect to Podman socket: failed to connect: dial tcp 127.0.0.1:2655: connectex: No connection could be made because the target machine actively refused it. That makes sense as the podman VM was not running. Let’s check the VM: >podman machine list NAME         ...

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

Cleaner switch expressions with pattern matching in C#

Ever find yourself mapping multiple string values to the same result? Being a C# developer for a long time, I sometimes forget that the C# has evolved so I still dare to chain case labels or reach for a dictionary. Of course with pattern matching this is no longer necessary. With pattern matching, you can express things inline, declaratively, and with zero repetition. A small example I was working on a small script that should invoke different actions depending on the environment. As our developers were using different variations for the same environment e.g.  "tst" alongside "test" , "prd" alongside "prod" .  We asked to streamline this a long time ago, but as these things happen, we still see variations in the wild. This brought me to the following code that is a perfect example for pattern matching: The or keyword here is a logical pattern combinator , not a boolean operator. It matches if either of the specified pattern...