Un árbol de expresión no puede contener una llamada o invocación que use argumentos opcionales

145

Un árbol de expresión no puede contener una llamada o invocación que use argumentos opcionales

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

Donde edit tenía un segundo argumento anulable.

¿Por qué es esto?

bevacqua
fuente

Respuestas:

106

La API del árbol de expresión subyacente no admite argumentos opcionales.

Para el código compilado por IL, el compilador de C # inserta los valores predeterminados en el momento de la compilación (codificado), porque el CLR no admite métodos de llamada con argumentos opcionales cuando los argumentos no se proporcionan explícitamente.

usr
fuente
2
¿Esto de alguna manera incluye sobrecargas? Estaba recibiendo esto cuando hice una sobrecarga. Algo así como vacío Blah (cadena a) y vacío Blah (objeto a). Cuando traté de hacer una llamada MOQ a la versión con objeto, me dio este error.
vbullinger
44
Las sobrecargas son totalmente compatibles en el sentido de que una sobrecarga particular estará codificada en el árbol.
usr
1
Mensaje de error bastante críptico, pero esta respuesta mostró el camino, tenía un parámetro opcional con un valor predeterminado en el método que estaba tratando de burlar.
vpalmu
139

Tenía el mismo mensaje cuando intentaba usar Mock.setup para burlarse de un método con múltiples parámetros predeterminados. Solo tenía que agregar los parámetros adicionales en la lambda.

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

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))
ds4940
fuente
1
Esto me ayudo. Me faltaba el It.IsAny<object>. Básicamente me faltaba un parámetro parasomeMethod()
akasoggybunz
También tuve que asegurarme de incluir valores para cada parámetro en el método (a pesar de que varios parámetros en la firma del método tienen valores predeterminados establecidos).
slashNburn
1
Dependiendo del caso de uso también ... x.someMethod(default,default)... se puede usar.
LosManos