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?

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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.