260

An expression tree may not contain a call or invocation that uses optional arguments

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

Where edit had a second, nullable argument.

Why is this?

0

6 Answers 6

308

Had the same message when trying to use Mock.setup to mock a method with multiple default parameters. I just had to add the additional parameters in the lambda.

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

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))
2
  • 48
    Depending on use case also ...x.someMethod(default,default)... can be used.
    – LosManos
    Commented Sep 25, 2019 at 14:27
  • This worked for me and as per @LosManos comments default is very handy and simple syntax Commented Jun 11 at 14:36
159

The underlying expression tree API does not support optional arguments.

For IL-compiled code the C# compiler inserts the default values at compile time (hard-coded), because the CLR does not support calling methods with optional arguments either when the arguments are not provided explicitly.

3
  • 2
    Does this somehow include overloads? I was getting this when I made an overload. Something like void Blah(string a) and void Blah(object a). When I tried to MOQ out a call to the version with object, it gave me this error.
    – vbullinger
    Commented Mar 21, 2013 at 14:02
  • 6
    Overloads are fully supported in the sense that a particular overload will be hard-coded into the tree.
    – usr
    Commented Mar 21, 2013 at 14:26
  • 1
    Pretty cryptic error message, but this answer showed the way, I had optional parameter with default value on the method is was trying to mock.
    – vpalmu
    Commented Mar 24, 2016 at 18:38
6

Error: 'an exception tree may not contain a call or invocation that uses option arguments'

Why: Because you are not providing the optional parameters when calling the method. Mainly you get this with .net core when using IAsyncProxy service object.

Fix: Pass all the optional parameters value, you may use default value if you.

1
  • 1
    Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
    – Community Bot
    Commented Dec 16, 2021 at 15:00
5

You might want to test that a method that has default parameters is called without any argument passed, in that case:

myMock.someMethod(default,default)

can work

3

I dealt with it by adding the optional parameter with a value . It worked. The same thing happened when I tried mocking while doing a setup .

0

I was getting this error with this:

var values = from ac in _dbContext.Entities<AuthCompany>()
                                 from uc in _dbContext.Entities<UserCompany>()
                                            .Where(x => x.CompanyID == ac.CompanyID).DefaultIfEmpty()
                                 select ac;

I fixed it by extracting the DbQuerys into their own variables:

var authCompanyEntities = _dbContext.Entities<AuthCompany>();
var userCompanyEntities = _dbContext.Entities<UserCompany>();

var values = from ac in authCompanyEntities
             from uc in userCompanyEntities.Where(x => x.CompanyID == ac.CompanyID).DefaultIfEmpty()
             select ac;

Not the answer you're looking for? Browse other questions tagged or ask your own question.