为什么这行得通,Returns((string food) => eat(food))
而这不行:Returns(food => eat(food))
?
完整的工作示例:
class Program
{
static void Main(string[] args)
{
var animal = new Mock<IAnimal>();
Func<string, string> eat = food => $"Nom nom nom {food}";
// works
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(eat);
// works
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns((string food) => eat(food));
//cannot convert lambda expression to type 'string' because it is not a delegate type
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => eat(food));
//cannot convert lambda expression to type 'string' because it is not a delegate type
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => $"Nom nom nom {food}");
}
}
public interface IAnimal
{
string Eat(string food);
}
回复作为答案,所以我可以粘贴一些代码...
这不是 Lasse V. Karlsen 建议的重载次数。该行为是由于铸造造成的。请参阅以下代码中的注释:
//works because "eat" knows it's own input type
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(eat);
// works because you are explicitly typing input param
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns((string food) => eat(food));
但是,当您使用 lambda 表达式时,事情会变得有点棘手,因为 lambda 表达式实际上没有输入类型
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns((string food) => eat(food));
// is equivalent to:
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns((string food) => {return eat(food); });
但{return eat(food);}
不知道是什么类型food
。
因此,当你打电话
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => eat(food));
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => $"Nom nom nom {food}");
编译器不知道食物是什么类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句