如何从方法返回操作类型

时间:2013-02-07 18:31:06

标签: c# c#-4.0

我试图找出如何从方法返回一个动作。我在网上找不到这个例子。这是我试图运行的代码,但它失败了:

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 个答案:

答案 0 :(得分:4)

问题是textActionAction<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();