Une arborescence d'expression ne peut pas contenir un appel ou une invocation qui utilise des arguments facultatifs


146

Une arborescence d'expression ne peut pas contenir un appel ou une invocation qui utilise des arguments facultatifs

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

Où edit avait un deuxième argument Nullable.

Pourquoi est-ce?

Réponses:


106

L' API d'arborescence d'expression sous-jacente ne prend pas en charge les arguments facultatifs.

Pour le code compilé par IL, le compilateur C # insère les valeurs par défaut au moment de la compilation (codées en dur), car le CLR ne prend pas non plus en charge les méthodes d'appel avec des arguments facultatifs lorsque les arguments ne sont pas fournis explicitement.


2
Cela inclut-il en quelque sorte les surcharges? J'avais ça quand j'ai fait une surcharge. Quelque chose comme vide Blah (chaîne a) et vide Blah (objet a). Lorsque j'ai essayé de MOQ un appel à la version avec objet, cela m'a donné cette erreur.
vbullinger

4
Les surcharges sont entièrement prises en charge dans le sens où une surcharge particulière sera codée en dur dans l'arborescence.
usr

1
Message d'erreur assez cryptique, mais cette réponse a montré le chemin, j'avais un paramètre facultatif avec une valeur par défaut sur la méthode que j'essayais de se moquer.
vpalmu

143

Avait le même message en essayant d'utiliser Mock.setup pour simuler une méthode avec plusieurs paramètres par défaut. Je devais juste ajouter les paramètres supplémentaires dans le lambda.

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

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

1
Cela m'a aidé. Je manquais le It.IsAny<object>. Fondamentalement, il me manquait un paramètre poursomeMethod()
akasoggybunz

Je devais également m'assurer d'inclure des valeurs pour chaque paramètre de la méthode (malgré plusieurs paramètres dans la signature de la méthode ayant des valeurs par défaut définies).
slashNburn

2
Selon le cas d'utilisation, ... x.someMethod(default,default)... peut également être utilisé.
LosManos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.