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?

bevacqua
quelle

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.

usr
quelle
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>()))
ds4940
quelle
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