表达<FUNC <t时,布尔>&GT; vs Func <t,bool>在方法重载中

时间:2018-04-06 12:58:42

标签: c# .net fakeiteasy

以下3种方法是我使用的库的一部分,FakeItEasy:

public static T Matches<T>(this IArgumentConstraintManager<T> scope, Func<T, bool> predicate, string description);

public static T Matches<T>(this IArgumentConstraintManager<T> manager, Func<T, bool> predicate, string descriptionFormat, params object[] args);

public static T Matches<T>(this IArgumentConstraintManager<T> scope, Expression<Func<T, bool>> predicate);

使用Visual Studio 2017时遇到以下问题。 我想提供谓词为Func<T,bool>而不是Expression<Func<T, bool>>。 原因是我的函数比较了类的动态属性,如下所示:

 A.CallTo(() => A<Class>.That.Matches(obj => obj.DynamicProperty == "text")).MustHaveHappened();

DynamicProperty标有dynamic个关键字,我收到编译时错误

  

表达式树可能不包含动态操作

https://i.imgur.com/ujetxPh.png 好的我明白了。表达式不支持它。 我想选择使用Func<T, bool>的重载。

如果有两种方法在谓词类型(表达式和函数)上有所不同,我该如何选择一种方法而不是另一种方法?

正如您在上述方法定义中所看到的,Func<T,bool>重载具有额外的string description参数。我希望这对于编译器选择适当的重载是足够的。

所以我改变了我的电话:

A.CallTo(() => A<Class>.That.Matches(obj => obj.DynamicProperty == "text", "testing")).MustHaveHappened();

仍然得到相同的编译器时间错误,但是当我将鼠标悬停在Visual Studio中的方法上时,工具提示说选择的方法是Func<T,bool>。 那么为什么我仍然无法编译它,并且出现了一些关于表达式树的错误?我不想使用任何表达树!

所以,只有当我将谓词放在一个单独的方法中时,我才设法让它编译

public bool Test(Class obj){
    return obj.DynamicProperty == "text";
}

并将我的支票更改为

A.CallTo(() => A<Class>.That.Matches(Test, "testing")).MustHaveHappened();

这似乎可以解决问题。

但我仍然希望编译器将使用lamda语法编写的函数视为Func<T,bool>而不是Expression<Func<T,bool>>

这是VS或编译器中的错误还是我遗漏了什么?

编辑 - 重现它的步骤/设置

创建一个空白控制台项目替换packages.config和Program.cs:

https://gist.github.com/michaelbudnik/33f3dd39df038ba1d02f01dc9659002b

1 个答案:

答案 0 :(得分:3)

编译器抱怨的表达式是&#34; CallTo&#34;的参数。方法:

A.CallTo(() => mandrill.SendMessageTemplate(A<SendMessageTemplateRequest>.That.Matches(...)));

因此选择Matches的过载并不重要。