为什么 Moq 有时需要在 Returns 中进行显式类型声明?

亚历山大·波普

为什么这行得通,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);
}
安德鲁·P

回复作为答案,所以我可以粘贴一些代码...

这不是 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么拆箱需要在C#中进行显式转换?

来自分类Dev

为什么需要在Python的.format方法中进行显式字符串转换?

来自分类Dev

为什么在熊猫中进行元素操作时有时需要添加.value?

来自分类Dev

为什么有时有时将复制构造函数声明为显式非内联的?

来自分类Dev

为什么F#有两种类型的显式类型声明?

来自分类Dev

为什么我有时需要在 proc 作为 arg 传递时使用 & 前缀?

来自分类Dev

在Scala 2.13中,为什么有时有时无法显式地召唤类型类?

来自分类Dev

为什么有时不需要在Lambda中捕获const变量?

来自分类Dev

为什么有时我们需要在根目录下挂载那些文件?

来自分类Dev

为什么有时需要在docker上运行nginx?

来自分类Dev

为什么有时需要在将对象作为参数传递之前创建变量

来自分类Dev

为什么我有时需要在列表中使用 key()?

来自分类Dev

为什么我有时不需要使用“get”而有时需要使用“get”进行过滤?

来自分类Dev

为什么我需要在docker-compose.yml中显式声明env_file?

来自分类Dev

为什么我需要在C#显式实现中将'this'转换为接口类型?

来自分类Dev

为什么对n级类型需要显式的forall量词?

来自分类Dev

努力了解模型中存在关联时为什么需要在Rails中进行联接/包含

来自分类Dev

Java 为什么在使用大括号时需要在 lambda 中进行异常处理

来自分类Dev

为什么对大数进行数学运算有时需要中间变量才能返回正确的结果?

来自分类Dev

为什么有时仍显示_site文件以进行提交?

来自分类Dev

为什么有时需要在`data.frame()`中将`.`括在`do`中的命名参数中?

来自分类Dev

为什么在执行显式转换时转换构造函数需要声明复制构造函数?

来自分类Dev

为什么抽象变量需要在Scala中进行类型注释?

来自分类Dev

Docker:为什么我需要在Ubuntu中进行sudo?

来自分类Dev

Python陈述式:有时为True,有时为False。为什么?

来自分类Dev

为什么要避免在Haskell中进行显式递归?

来自分类Dev

为什么SqS消息有时仍在队列中进行

来自分类Dev

为什么必须显式声明嵌套类型?

来自分类Dev

返回兼容类型时,为什么需要显式std :: move?

Related 相关文章

  1. 1

    为什么拆箱需要在C#中进行显式转换?

  2. 2

    为什么需要在Python的.format方法中进行显式字符串转换?

  3. 3

    为什么在熊猫中进行元素操作时有时需要添加.value?

  4. 4

    为什么有时有时将复制构造函数声明为显式非内联的?

  5. 5

    为什么F#有两种类型的显式类型声明?

  6. 6

    为什么我有时需要在 proc 作为 arg 传递时使用 & 前缀?

  7. 7

    在Scala 2.13中,为什么有时有时无法显式地召唤类型类?

  8. 8

    为什么有时不需要在Lambda中捕获const变量?

  9. 9

    为什么有时我们需要在根目录下挂载那些文件?

  10. 10

    为什么有时需要在docker上运行nginx?

  11. 11

    为什么有时需要在将对象作为参数传递之前创建变量

  12. 12

    为什么我有时需要在列表中使用 key()?

  13. 13

    为什么我有时不需要使用“get”而有时需要使用“get”进行过滤?

  14. 14

    为什么我需要在docker-compose.yml中显式声明env_file?

  15. 15

    为什么我需要在C#显式实现中将'this'转换为接口类型?

  16. 16

    为什么对n级类型需要显式的forall量词?

  17. 17

    努力了解模型中存在关联时为什么需要在Rails中进行联接/包含

  18. 18

    Java 为什么在使用大括号时需要在 lambda 中进行异常处理

  19. 19

    为什么对大数进行数学运算有时需要中间变量才能返回正确的结果?

  20. 20

    为什么有时仍显示_site文件以进行提交?

  21. 21

    为什么有时需要在`data.frame()`中将`.`括在`do`中的命名参数中?

  22. 22

    为什么在执行显式转换时转换构造函数需要声明复制构造函数?

  23. 23

    为什么抽象变量需要在Scala中进行类型注释?

  24. 24

    Docker:为什么我需要在Ubuntu中进行sudo?

  25. 25

    Python陈述式:有时为True,有时为False。为什么?

  26. 26

    为什么要避免在Haskell中进行显式递归?

  27. 27

    为什么SqS消息有时仍在队列中进行

  28. 28

    为什么必须显式声明嵌套类型?

  29. 29

    返回兼容类型时,为什么需要显式std :: move?

热门标签

归档