返回委托的委托

时间:2017-09-11 18:29:04

标签: c#

我正在尝试创建一个将返回委托的委托。然后我想调用这个委托,并调用返回的内部委托。我的问题是:为什么这会导致错误?如何更改此代码以完成我正在尝试做的事情?

错误消息是“预期方法名称”。

delegate string del();
delegate Delegate nestedDel();

public static void main()
{
    nestedDel myNestedDel = () =>
    {
        del myInnerDel = () => { return "inside"; };
        return myInnerDel;
    };

    Delegate k = myNestedDel();

    k(); // Error!!!
}

2 个答案:

答案 0 :(得分:2)

简而言之,你搞砸了这些类型。其中一个代表应返回另一个,因此其返回类型应该只是另一个委托的类型。在您的代码示例中:

delegate string del();
delegate Delegate nestedDel();

您实际上是在返回一个委托,但DelegateMulticastDelegate只是基础结构基类,不能直接调用。通过使用这些类,您将丢失有关参数列表和返回值的信息,因此简单的call()运算符无法正常工作。正如Lee在评论中提到的那样,你可以通过k.DynamicInvoke()来做到这一点,但这样做太过分了。只需使用正确的类型名称而不是Delegate

工作示例:

delegate string InnerDel();
delegate InnerDel OuterDel();  // this one returns an instance of Inner delegate

public static void Main()
{
    OuterDel myOuterDelegate = () =>
    {
        InnerDel myInnerDel = () => { return "inside"; };
        return myInnerDel;
    };

    InnerDel k = myOuterDelegate();

    k();
}

就个人而言,我更喜欢Func / Actions而不是定义我自己的委托类......至少只要它们最多只有几个参数。在func / action方面,它看起来像这样:

public static void Main()
{
    Func<Func<string>> myOuterDelegate = () =>
    {
        Func<string> myInnerDel = () => { return "inside"; };
        return myInnerDel;
    };

    var k = myOuterDelegate();

    k();
}

甚至..

public static void Main()
{
    Func<Func<string>> myOuterDelegate = () => () => { return "inside"; };

    var k = myOuterDelegate();

    k();
}

答案 1 :(得分:1)

您的错误是因为无法使用函数调用语法调用Delegate类型的实例,即k();

您可以使用DynamicInvoke调用它:

string s = (string)k.DynamicInvoke();

显然这很容易出现运行时错误,因此更好的方法是更改​​nestedDel的返回类型,例如

delegate Func<string> nestedDel();

nestedDel myNestedDel = () =>
{
    Func<string> myInnerDel = () => { return "inside"; };
    return myInnerDel;
};

stringk = myNestedDel();