分配给 void delegate 的 lambda 会丢弃 C# 中的非 void return 类型吗?
Do lambdas assigned to void delegate discard non-void return type in C#?
我可以从分配给 Action(需要 void return 类型)的 lambda 中调用非 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 因为那是预期的 return 类型,所以它丢弃它调用的非 void 函数的 return 类型。对吗?
你的例子
Action action = ()=>foo();
就像任何其他方法一样:
public void MyTestMethod()
{
// do something
foo();
// do some more
}
这在 C# 中是完全合法的(尽管一些静态分析器会警告您不要使用 foo()
的 return 值)。
第二个例子:
action = foo;
不起作用,因为 foo
本身是一个具有 return 类型的方法,因此只能分配给类型 Func<bool>
的变量,但不能分配给 [=16] =].另一方面,lambda () => foo()
没有 return 类型并且是有效的 Action
.
嗯,在这行代码中:
Action action = ()=> foo(); // This compiles
您实际上使用 closure 创建了另一个运行函数的方法:
void AnonymousMethod()
{
foo();
}
将另一个方法分配给调用方法 foo
的委托与直接将 foo
方法分配给委托不同。这就是为什么代码行:
Action action = foo;
不会编译,因为 Action
委托有 return 类型的 void 而方法 foo
没有。
我可以从分配给 Action(需要 void return 类型)的 lambda 中调用非 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 因为那是预期的 return 类型,所以它丢弃它调用的非 void 函数的 return 类型。对吗?
你的例子
Action action = ()=>foo();
就像任何其他方法一样:
public void MyTestMethod()
{
// do something
foo();
// do some more
}
这在 C# 中是完全合法的(尽管一些静态分析器会警告您不要使用 foo()
的 return 值)。
第二个例子:
action = foo;
不起作用,因为 foo
本身是一个具有 return 类型的方法,因此只能分配给类型 Func<bool>
的变量,但不能分配给 [=16] =].另一方面,lambda () => foo()
没有 return 类型并且是有效的 Action
.
嗯,在这行代码中:
Action action = ()=> foo(); // This compiles
您实际上使用 closure 创建了另一个运行函数的方法:
void AnonymousMethod()
{
foo();
}
将另一个方法分配给调用方法 foo
的委托与直接将 foo
方法分配给委托不同。这就是为什么代码行:
Action action = foo;
不会编译,因为 Action
委托有 return 类型的 void 而方法 foo
没有。