Ein Ausdrucksbaum darf keinen Aufruf oder Aufruf enthalten, der optionale Argumente verwendet


145

Ein Ausdrucksbaum darf keinen Aufruf oder Aufruf enthalten, der optionale Argumente verwendet

return this.RedirectToAction<MerchantController>(x => x.Edit(merchantId));

Wo edit ein zweites, nullbares Argument hatte.

Warum ist das?

Antworten:


106

Die zugrunde liegende Ausdrucksbaum-API unterstützt keine optionalen Argumente.

Für IL-kompilierten Code fügt der C # -Compiler die Standardwerte zur Kompilierungszeit ein (fest codiert), da die CLR Aufrufmethoden mit optionalen Argumenten auch dann nicht unterstützt, wenn die Argumente nicht explizit angegeben werden.


2
Beinhaltet dies irgendwie Überlastungen? Ich bekam das, als ich eine Überladung machte. So etwas wie Blah (String a) und Blah (Objekt a). Als ich versuchte, einen Aufruf der Version mit Objekt zu MOQen, gab es diesen Fehler.
Vbullinger

4
Überladungen werden in dem Sinne vollständig unterstützt, dass eine bestimmte Überladung fest in den Baum codiert wird.
usr

1
Ziemlich kryptische Fehlermeldung, aber diese Antwort zeigte den Weg, ich hatte optionale Parameter mit Standardwert auf der Methode versucht zu verspotten.
Vpalmu

139

Hatte die gleiche Meldung beim Versuch, mit Mock.setup eine Methode mit mehreren Standardparametern zu verspotten. Ich musste nur die zusätzlichen Parameter im Lambda hinzufügen.

void someMethod(string arg1 = "", string arg2 = "")

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))

1
Das hat mir geholfen. Mir hat das gefehlt It.IsAny<object>. Grundsätzlich fehlte mir ein Parameter fürsomeMethod()
akasoggybunz

Ich musste auch sicherstellen, dass ich Werte für jeden Parameter in die Methode aufgenommen habe (trotz mehrerer Parameter in der Methodensignatur, für die Standardwerte festgelegt wurden).
SlashNburn

1
Je nach Anwendungsfall kann auch ... x.someMethod(default,default)... verwendet werden.
LosManos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.