gpt4 book ai didi

c# - 对 `Action` 委托(delegate)和 lambda 表达式的混淆

转载 作者:太空狗 更新时间:2023-10-29 17:29:38 24 4
gpt4 key购买 nike

private void StringAction(string aString) // method to be called
{
return;
}

private void TestDelegateStatement1() // doesn't work
{
var stringAction = new System.Action(StringAction("a string"));
// Error: "Method expected"
}

private void TestDelegateStatement2() // doesn't work
{
var stringAction = new System.Action(param => StringAction("a string"));
// Error: "System.Argument doesn't take 1 arguments"

stringAction();
}

private void TestDelegateStatement3() // this is ok
{
var stringAction = new System.Action(StringActionCaller);

stringAction();
}

private void StringActionCaller()
{
StringAction("a string");
}

我不明白为什么 TestDelegateStatement3 有效,但 TestDelegateStatement1 失败。在这两种情况下,Action 都提供了一个采用零参数的方法。他们可能调用一个采用单个参数(aString)的方法,但这应该是无关紧要的。他们不接受参数。这对 lamda 表达式来说是不可能的,还是我做错了什么?

最佳答案

如您所说,Action 不接受任何参数。如果你这样做:

var stringAction = new System.Action(StringAction("a string"));

你实际上在这里执行了方法,所以那不是方法参数。

如果你这样做:

var stringAction = new System.Action(param => StringAction("a string"));

你告诉它你的方法接受一个名为 param 的参数,而 Action 没有。

所以正确的做法是:

var stringAction = new System.Action( () => StringAction("a string"));

或更紧凑:

Action stringAction = () => StringAction("a string");

空括号用于指示 lambda 不带任何参数。

关于c# - 对 `Action` 委托(delegate)和 lambda 表达式的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1382950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com