我试图找出如何从方法返回一个动作。我在网上找不到这个例子。这是我试图运行的代码,但它失败了:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
var testAction = test("it works");
testAction.Invoke(); //error here
Console.ReadLine();
}
static Action<string> test(string txt)
{
return (x) => Console.WriteLine(txt);
}
}
}
答案 0 :(得分:4)
问题是textAction
是Action<string>
,这意味着你需要传递一个字符串:
textAction("foo");
我怀疑你想要这样的东西:
class Program
{
static void Main(string[] args)
{
var testAction = test();
testAction("it works");
// or textAction.Invoke("it works");
Console.ReadLine();
}
// Don't pass a string here - the Action<string> handles that for you..
static Action<string> test()
{
return (x) => Console.WriteLine(x);
}
}
答案 1 :(得分:3)
您要返回的操作接受string
作为参数。当你Invoke
时,你需要提供该参数:
testAction("hello world");
当然,您的操作会忽略该参数,因此更合适的修复方法是更改操作以使其不接受任何参数:
static Action test(string txt)
{
return () => Console.WriteLine(txt);
}
现在您的程序将按预期工作。
答案 2 :(得分:2)
由于你所拥有的是Action<String>
你的调用需要包含你操作的字符串。
testAction.Invoke("A string");
应该有效
答案 3 :(得分:1)
您要创建的操作应该是无参数的,以便您可以在不使用参数的情况下调用它。因此,请更改test
的返回类型,同时删除您声明但从未使用的x
:
static Action test(string txt)
{
return () => Console.WriteLine(txt);
}
然后调用代码将起作用:
var testAction = test("it works"); // store the string in txt
testAction.Invoke();
Console.ReadLine();