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?

bevacqua
la source

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.

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