wake-up-neo.com

Der Lambda-Ausdruck kann nicht in den Typ 'object' konvertiert werden, da es sich nicht um einen Delegattyp handelt

Ich habe eine Basisklasse, die eine bool -Eigenschaft hat, die wie folgt aussieht:

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

Ich erbe eine andere Klasse von ihr und versuche, InProgress als Delegierten zum Wörterbuch hinzuzufügen. Aber es wirft einen Fehler. So sieht meine abgeleitete Klasse aus:

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

}

Dies ist der Fehler, den ich erhalte:

Der Lambda-Ausdruck kann nicht in den Typ 'object' konvertiert werden, da es sich nicht um einen Delegattyp handelt

Was mache ich hier falsch?

26
Asdfg

Am besten wäre es, das Wörterbuch stark typisieren zu lassen, aber wenn Sie das Lambda zuerst einem bestimmten Lambda (Delegaten) zuweisen, sollte es funktionieren (da der Compiler dann das Delegatenformat kennt):

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

Oder durch direktes Gießen, gleicher Effekt

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

Ein solches Wörterbuchformat als Objekt kann natürlich besprochen werden, da Sie das Delegatenformat kennen müssen, um es verwenden zu können.

23
Me.Name

Ich habe diesen Fehler erhalten, als ich vermisst wurde

using System.Data.Entity;
10
Craig Howard

Obwohl die Lösung von @ Me.Name für sich allein gültig ist, gibt es einen zusätzlichen Trick, der in einigen Situationen nützlich sein könnte (was für mich sicherlich der Fall war): Wenn Sie mehrere Lambdas mit dieser Technik konvertieren, sind Sie es kann die Besetzung als Hilfsmethode nach den Regeln von

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

und dann einfach anrufen

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

Dadurch sparen Sie später Zeit. Wenn Sie sich entscheiden, die Signatur zu ändern, müssen Sie dies nur an einer Stelle tun.

2
vaxquis

Ich bin auf dieses Problem gestoßen, als ich Unit-Tests schrieb. Ich habe versucht, das Verhalten einer Datenbank zu verspotten, um ein neues Objekt aus einem Repository zurückzugeben, anstatt tatsächlich eine Verbindung zu einer Datenbank herzustellen.

Stellen Sie sicher, dass Ihr Objekt über einen verwendbaren Konstruktor verfügt. Sie können dieses Objekt möglicherweise nicht auf die gewünschte Weise instanziieren. Stellen Sie sicher, dass Sie, wenn Sie ein Lambda verwenden, um auf einen Konstruktor zu zeigen, dass der Konstruktor in einer normalen Instanziierungsanweisung auf dieselbe Weise aufgerufen werden kann.

d.h.

return x => new FakeObject();

sagen im Fall von

var fake = new FakeObject();

würde nicht funktionieren, dann wird auch das Lambda ausfallen, also sei vorsichtig.

0
David Hunsicker