Uma árvore de expressão pode não conter uma chamada ou invocação que use argumentos opcionais

145

Uma árvore de expressão pode não conter uma chamada ou invocação que use argumentos opcionais

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

Onde edit tinha um segundo argumento anulável.

Por que é isso?

bevacqua
fonte

Respostas:

106

A API da árvore de expressão subjacente não suporta argumentos opcionais.

Para código compilado por IL, o compilador C # insere os valores padrão em tempo de compilação (codificado), porque o CLR não oferece suporte a métodos de chamada com argumentos opcionais quando os argumentos não são fornecidos explicitamente.

usr
fonte
2
De alguma forma, isso inclui sobrecargas? Eu estava entendendo isso quando sobrecarreguei. Algo como vazio Blah (corda a) e vazio Blah (objeto a). Quando tentei MOQ uma chamada para a versão com objeto, ele me deu esse erro.
precisa saber é o seguinte
4
As sobrecargas são totalmente suportadas no sentido de que uma sobrecarga específica será codificada na árvore.
usr
1
Mensagem de erro bastante enigmática, mas esta resposta mostrou o caminho, eu tinha parâmetro opcional com valor padrão no método está tentando zombar.
vpalmu
139

Tinha a mesma mensagem ao tentar usar o Mock.setup para simular um método com vários parâmetros padrão. Eu apenas tive que adicionar os parâmetros adicionais no lambda.

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

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))
ds4940
fonte
1
Isso me ajudou. Eu estava sentindo falta do It.IsAny<object>. Basicamente, eu estava faltando um parâmetro parasomeMethod()
akasoggybunz
Eu também tive que me certificar de incluir valores para cada parâmetro no método (apesar de vários parâmetros na assinatura do método terem valores padrão definidos).
SlashNburn 29/07/19
1
Dependendo do caso de uso, também ... x.someMethod(default,default)... pode ser usado.
LosManos 25/09/19