Cannot convert lambda expression to type 'object' because it is not a delegate type
Asked Answered
C

5

61

I have a base class that has a bool property which looks like this:

public abstract class MyBaseClass
{
     public bool InProgress { get; protected set; }
}

I am inheriting it another class from it and trying to add InProgress as a delegate to the dictionary. But it throws me an error. This is how my Derived class looks like:

public abstract class MyClass
{
     Dictionary<string, object> dict = new Dictionary<string, object>();
     dict.Add("InProgress", InProgress => base.InProgress = InProgress);

}

This is the error I am getting:

Cannot convert lambda expression to type 'object' because it is not a delegate type

What am I doing wrong here?

Causative answered 23/4, 2014 at 14:16 Comment(6)
Exactly as the error message says - you've got a lambda expression and you're trying to convert it to object. Which delegate type did you want to convert it to, and how did you expect the compiler to know that?Huebner
Why are you trying to add a lambda to a dictionary?Vaisya
@DStanley It's not that unusual, is it?Macrophage
@Macrophage I didn't say it was unusual, I'm just wondering why in case there's a better way to accomplish the real goal.Vaisya
I am debugging third party code and refactoring it. This is part of the piece that i needed to get the code working in the first place as it was throwing error.Causative
Does this answer your question? Cannot convert lambda expression to type 'System.Delegate'Easterner
O
36

Best would be to have the dictionary strongly typed, but if you assign the lambda to a specific lambda (delegate) first, it should work (because the compiler then knows the delegate format):

Action<bool> inp = InProgress => base.InProgress = InProgress;
dict.Add("InProgress", inp);

Or by casting it directly, same effect

dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));

Of course having such a dictionary format as object is discussable, since you'll have to know the delegate format to be able to use it.

Oolite answered 23/4, 2014 at 14:21 Comment(0)
M
22

I got this error when I was missing

using System.Data.Entity;
Mages answered 19/1, 2017 at 22:48 Comment(2)
This worked for me thanks! Wondering as, in one file this was working and not in another so thought had to be something silly!Faustinafaustine
You are awesome! This was it for me ... This is also the first time happening, have been using EF for a while now but never saw this and i expect at least that the suggestion of a Import would arise ...Lanfri
E
6

Although the solution by @Me.Name is completely valid by itself, there's an additional trick that may come in handy in some situations (it certainly did for me): if you're converting multiple lambdas using this technique, you can factor the cast as a helper method, along the lines of

object myDelegateToObject ( Action<bool> action ) {
    return action; // autocast to `object` superclass, no explicit cast needed
}

and then call it by simply

dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));

It may save you time later on - if you decide to change to change the signatures, you will have to do so in one place only.

Extortionate answered 30/12, 2015 at 22:49 Comment(0)
N
0

I ran into this problem while writing unit tests. I was attempting to mock the behavior of a database to return a new object from a repository instead of actually connecting to a database.

Make sure your object has a usable constructor. You may not be able to successfully instantiate that object the way you want to. Ensure if you using a lambda to point to a constructor that the constructor can be called in the same way in a normal instantiation statement.

i.e.

return x => new FakeObject();

say in the case of

var fake = new FakeObject();

would not work then the lambda will also fail so be careful.

Nacred answered 7/12, 2017 at 19:6 Comment(0)
A
-1

If you encounter this error in nopcommerce you need to add import line using System.Linq;

Amethist answered 14/9, 2020 at 6:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.