表达式树可能不包含使用可选参数的调用或调用

Posted

技术标签:

【中文标题】表达式树可能不包含使用可选参数的调用或调用【英文标题】:An expression tree may not contain a call or invocation that uses optional arguments 【发布时间】:2012-09-06 23:21:21 【问题描述】:

表达式树可能不包含使用 可选参数

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

edit 有第二个可以为空的参数。

这是为什么?

【问题讨论】:

【参考方案1】:

错误:'异常树可能不包含使用选项参数的调用或调用'

为什么:因为你在调用方法时没有提供可选参数。主要是您在使用 IAsyncProxy 服务对象时通过 .net 核心获得此功能。

修复:传递所有可选参数值,如果你可以使用默认值。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

尝试使用 Mock.setup 模拟具有多个默认参数的方法时出现相同的消息。我只需要在 lambda 中添加额外的参数。

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

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))

【讨论】:

根据用例也可以使用 ...x.someMethod(default,default)...。【参考方案3】:

underlying expression tree API 不支持可选参数。

对于 IL 编译的代码,C# 编译器会在编译时插入默认值(硬编码),因为 CLR 不支持在未显式提供参数时调用带有可选参数的方法。

【讨论】:

这是否包含重载?当我超载时,我得到了这个。像 void Blah(string a) 和 void Blah(object a) 这样的东西。当我尝试 MOQ 调用带有对象的版本时,它给了我这个错误。 完全支持重载,因为特定重载将被硬编码到树中。 相当神秘的错误消息,但这个答案显示了方法,我有可选参数,该方法的默认值是试图模拟。

以上是关于表达式树可能不包含使用可选参数的调用或调用的主要内容,如果未能解决你的问题,请参考以下文章

如何获取可选参数的默认值?

带有可选参数的 Postgresql 函数

Dart语法之可选参数

多个可选参数调用函数

从 C++ 调用带有可选参数的 Fortran 子例程

从 C++ 调用带有可选参数的 Fortran 子例程