Drzewo wyrażenia nie może zawierać wywołania ani wywołania używającego opcjonalnych argumentów

145

Drzewo wyrażeń nie może zawierać wywołania ani wywołania używającego opcjonalnych argumentów

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

Gdzie edit miał drugi argument dopuszczający wartość null.

Dlaczego to?

bevacqua
źródło

Odpowiedzi:

106

Bazowy drzewo wyrażenie API nie obsługuje opcjonalne argumenty.

W przypadku kodu skompilowanego w języku IL kompilator C # wstawia wartości domyślne w czasie kompilacji (zakodowane na stałe), ponieważ środowisko CLR nie obsługuje wywoływania metod z opcjonalnymi argumentami, gdy argumenty nie są jawnie podawane.

usr
źródło
2
Czy to w jakiś sposób obejmuje przeciążenia? Dostałem to, kiedy zrobiłem przeciążenie. Coś w rodzaju void Blah (ciąg a) i void Blah (obiekt a). Kiedy próbowałem MOQ wywołać wersję z obiektem, dało mi to ten błąd.
vbullinger
4
Przeciążenia są w pełni obsługiwane w tym sensie, że określone przeciążenie zostanie na stałe zakodowane w drzewie.
usr
1
Dość tajemniczy komunikat o błędzie, ale ta odpowiedź pokazała sposób, miałem opcjonalny parametr z domyślną wartością metody, którą próbowałem wyśmiewać.
vpalmu
140

Ten sam komunikat pojawił się podczas próby użycia Mock.setup do sfałszowania metody z wieloma parametrami domyślnymi. Musiałem tylko dodać dodatkowe parametry w lambdzie.

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

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))
ds4940
źródło
1
To mi pomogło. Brakowało mi It.IsAny<object>. Zasadniczo brakowało mi parametru dlasomeMethod()
akasoggybunz,
Musiałem również upewnić się, że uwzględniłem wartości dla każdego parametru w metodzie (mimo że kilka parametrów w sygnaturze metody ma ustawione wartości domyślne).
slashNburn
1
W zależności od przypadku użycia można również ... x.someMethod(default,default)...
LosManos