4

我试图弄清楚如何从方法中返回一个动作。我在网上找不到任何这样的例子。这是我尝试运行但失败的代码:

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);
        }
    }
}
4

4 回答 4

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);
    }
}
于 2013-02-07T18:33:03.667 回答
3

您返回的操作接受 astring作为它的参数。当您使用Invoke它时,您需要提供该参数:

testAction("hello world");

当然,您的操作会忽略该参数,因此更合适的解决方法是更改​​操作以使其不接受任何参数:

static Action test(string txt)
{
    return () => Console.WriteLine(txt);
}

现在您的程序将按预期工作。

于 2013-02-07T18:33:58.283 回答
2

由于您拥有的是Action<String>您的调用,因此您需要包含您正在操作的字符串。

testAction.Invoke("A string");

应该管用

于 2013-02-07T18:33:12.453 回答
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();
于 2013-02-07T18:33:22.070 回答