Un albero delle espressioni non può contenere una chiamata o un richiamo che utilizza argomenti opzionali


146

Un albero delle espressioni non può contenere una chiamata o un richiamo che utilizza argomenti opzionali

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

Dove modifica aveva un secondo argomento nullable.

Perchè è questo?

Risposte:


106

L' API dell'albero delle espressioni sottostante non supporta argomenti facoltativi.

Per il codice compilato con IL, il compilatore C # inserisce i valori predefiniti al momento della compilazione (hard-coded), poiché CLR non supporta i metodi di chiamata con argomenti facoltativi quando gli argomenti non vengono forniti in modo esplicito.


2
Questo in qualche modo include sovraccarichi? Lo stavo ottenendo quando ho fatto un sovraccarico. Qualcosa come il vuoto Blah (stringa a) e il vuoto Blah (oggetto a). Quando ho provato a inviare una chiamata alla versione MOQ con oggetto, mi ha dato questo errore.
— vbullinger,

4
I sovraccarichi sono pienamente supportati nel senso che un determinato sovraccarico verrà codificato nella struttura ad albero.
— usr

1
Messaggio di errore piuttosto criptico, ma questa risposta ha mostrato la strada, avevo un parametro opzionale con valore predefinito sul metodo che stava cercando di deridere.
— vpalmu,

143

Aveva lo stesso messaggio quando cercavo di usare Mock.setup per deridere un metodo con più parametri predefiniti. Ho dovuto solo aggiungere i parametri aggiuntivi nella lambda.

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

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

1
Questo mi ha aiutato. Mi mancava il It.IsAny<object>. Fondamentalmente mi mancava un parametro persomeMethod()
— akasoggybunz il

Ho anche dovuto assicurarmi di includere i valori per ogni parametro nel metodo (nonostante diversi parametri nella firma del metodo abbiano valori predefiniti impostati).
— slashNburn,

2
A seconda del caso d'uso è x.someMethod(default,default)possibile utilizzare anche ... ...
— LosManos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.