Дерево выражения не может содержать вызов или вызов, использующий необязательные аргументы.

155

Дерево выражения не может содержать вызов или вызов, использующий необязательные аргументы.

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

Если у edit был второй аргумент, допускающий значение NULL.

Почему это?

Bevacqua
источник

Ответы:

111

Основное выражение дерева API не поддерживает необязательные аргументы.

Для кода, скомпилированного с помощью IL, компилятор C # вставляет значения по умолчанию во время компиляции (жестко запрограммированные), поскольку среда CLR не поддерживает методы вызова с необязательными аргументами, если аргументы не указаны явно.

usr
источник
2
Это как-то связано с перегрузками? Получал такое, когда делал перегруз. Что-то вроде void Blah (строка a) и void Blah (объект a). Когда я попытался выполнить MOQ вызов версии с объектом, он дал мне эту ошибку.
vbullinger
4
Перегрузки полностью поддерживаются в том смысле, что конкретная перегрузка будет жестко закодирована в дереве.
usr
1
Довольно загадочное сообщение об ошибке, но этот ответ показал путь, у меня был необязательный параметр со значением по умолчанию в методе, который пытался имитировать.
vpalmu
163

Было такое же сообщение при попытке использовать Mock.setup для имитации метода с несколькими параметрами по умолчанию. Мне просто нужно было добавить дополнительные параметры в лямбду.

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

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))
ds4940
источник
6
В зависимости от варианта использования также ... x.someMethod(default,default)... можно использовать.
LosManos