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?

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.


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>()))

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.