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


155

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

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

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

Почему это?

Ответы:


111

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

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


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

6
В зависимости от варианта использования также ... x.someMethod(default,default)... можно использовать.
LosManos
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.