我发现当我使用lambdas作为被断言的方法的参数时,Rhino Mocks的AssertWasCalled失败.
测试:
_mockDoer.AssertWasCalled(x => x.Print(y => Console.WriteLine(“hi”)));
代码内部系统测试:
_doer.Print(y => Console.WriteLine(“hi”)));
这使得我认为lambdas是有效的代表类型的构造函数.
当我想到lambdas作为代表类型的构造函数时,我错过了什么重要吗?
解决方法
那么他们在“构造器”一词的任何正常用途中并不是真正的“构造者”.
它们是可以转换为委托类型或表达式树类型的表达式 – 后者对于进程外LINQ是至关重要的.
如果您真的在询问是否使用两个“等效”lambda表达式可以创建不相等的委托实例:是的,它是. IIRC,C#语言规范甚至呼吁,就是这样.
但是,多次使用相同的lambda表达式将不会始终创建不同的实例:
using System; class Test { static void Main(string[] args) { Action[] actions = new Action[2]; for (int i = 0; i < 2; i++) { actions[i] = () => Console.WriteLine("Hello"); } Console.WriteLine(actions[0] == actions[1]); } }
在我的盒子上,实际打印True – actions [0]和action [1]具有完全相同的值 – 它们指的是同一个实例.的确,我们可以进一步:
using System; class Test { static void Main(string[] args) { object x = CreateAction(); object y = CreateAction(); Console.WriteLine(x == y); } static Action CreateAction() { return () => Console.WriteLine("Hello"); } }
再次,这打印True.不能保证,但是在这里,编译器实际上创建了一个静态字段来缓存第一次需要的代理 – 因为它不捕获任何变量.
基本上这是一个你不应该依赖的编译器实现细节.