首页 文章

分配给void委托的lambda会丢弃C#中的非void返回类型吗?

提问于
浏览
3

我可以从一个lambda调用一个非void函数,该lambda被赋值给一个Action(它需要一个void返回类型):

static bool foo() { return true; }
...
// Action action = foo; // This gives a compile error though.
Action action = ()=>foo(); // This compiles

最初我在看一个 List.ForEach() 的例子时注意到了这一点 . 我可以从lambda执行一个非void函数并编译 .

起初这似乎是违反直觉的,并且让我认为你可以将非空函数分配给 void 委托(void表现得像一种逆变),但 Action action = foo; 不起作用 .

所以现在我假设正在发生的事情是lambda变为void,因为这是预期的返回类型,所以它丢弃了它调用的非void函数的返回类型 . 那是对的吗?

2 回答

  • 2

    好吧,在这行代码中:

    Action action = ()=> foo(); // This compiles
    

    您实际上创建了另一个使用closure运行函数的方法:

    void AnonymousMethod()
    {
       foo();
    }
    

    将另一个方法分配给调用方法 foo 的委托与分配 foo 方法直接委派不同 . 这就是为什么代码行:

    Action action = foo;
    

    不会编译,因为 Action 委托的返回类型为void,而方法 foo 则没有 .

  • 3

    你的榜样

    Action action = ()=>foo();
    

    就像任何其他方法一样:

    public void MyTestMethod()
    {
         // do something
         foo();
         // do some more
    }
    

    这在C#中是完全合法的(虽然一些静态分析器会警告你不要使用 foo() 的返回值) .

    第二个例子:

    action = foo;
    

    不起作用,因为 foo 本身是一个具有返回类型的方法,因此只能分配给 Func<bool> 类型的变量,而不能分配给 Action . 另一方面,lambda () => foo() 没有返回类型,并且是有效的 Action .

相关问题