C# 表达式<;Func<;T、 布尔>&燃气轮机;vs Func<;T、 布尔>;方法内重载
以下3种方法是我使用的库Fakeitesy的一部分:C# 表达式<;Func<;T、 布尔>&燃气轮机;vs Func<;T、 布尔>;方法内重载,c#,.net,fakeiteasy,C#,.net,Fakeiteasy,以下3种方法是我使用的库Fakeitesy的一部分: 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&l
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中将鼠标悬停在该方法上时,工具提示显示选择的方法是Func
one。
那么,为什么我仍然不能编译它,因为有一个关于表达式树的错误?我不想使用任何表达式树
因此,只有当我将谓词放在一个单独的方法中时,我才能使它编译
public bool Test(Class obj){
return obj.DynamicProperty == "text";
}
把我的支票换成
A.CallTo(() => A<Class>.That.Matches(Test, "testing")).MustHaveHappened();
A.CallTo(()=>A.That.Matches(Test,“testing”)).musthaveOccessed();
这似乎奏效了
但我仍然希望编译器将我使用lamda语法编写的函数视为Func
而不是表达式
这是VS或编译器中的错误还是我遗漏了什么
编辑-复制的步骤/设置
创建一个空白控制台项目替换packages.config和Program.cs:
编译器抱怨的表达式是“CallTo”方法的参数:
A.CallTo(()=>mandrill.SendMessageTemplate(A.That.Matches(…));
因此,选择哪种重载的匹配项无关紧要。通过定义方法,已知类型为
Func
如果在调用之前在变量中定义函数,如Sovar test=new Func((class)=>{class.DynamicProperty==“text”;})
然后调用传递函数的匹配,但不这样做,lambda可以是Func
和Expression
。那么,为什么编译器不警告您这种不确定性,而选择带有表达式参数的方法呢?即使添加了一个应该是鉴别器的附加参数,它仍然会抱怨表达式中不支持的动态属性。如果有两个方法,一个参数为Expression
,另一个参数为Func
,编译器会返回歧义错误。这与流畅的断言有什么关系。这篇文章讲的是假货。@Dennisdoomens是的,对不起。编辑标记
public bool Test(Class obj){
return obj.DynamicProperty == "text";
}
A.CallTo(() => A<Class>.That.Matches(Test, "testing")).MustHaveHappened();
A.CallTo(() => mandrill.SendMessageTemplate(A<SendMessageTemplateRequest>.That.Matches(...)));