是否可以编写类似 - ()()的语法?

时间:2010-04-13 20:25:06

标签: c#

我在某个地方读了一本电子书(我很想再次找到),通过使用委托,可以编写具有如下语法的代码:

 ()(); // where delegate precedes this.

任何人都可以提供任何细节如何可能/在什么情况下会发生这种情况?

7 个答案:

答案 0 :(得分:127)

你可以比目前给出的例子略胜一筹,事实上......你可以任意扩展它:

class Test
{
    delegate Hofstadter Hofstadter();

    static void Main()
    {
        // Unfortunately I'm clearly not as smart as the real thing
        Hofstadter douglas = () => null;

        douglas()()()()()()();
    }
}

这是另一个可怕的选择,对于额外的ASCII艺术:

class Test
{
    delegate __ ___();
    delegate ___ __(___ _);

    static void Main()
    {
        ___ _ = () => null;

        _ ()((_))();
    }
}

请永远不要这样做。

编辑:最后一个 - 虽然它只是用下划线替换其他内容,并尽可能重用名称:

class Test
{
    delegate void _();
    delegate __<_> ___<_>();
    delegate ___<_> __<_>(___<_> ____);

    static ___<_> ____<_>(___<_> ____) { return ____; }
    static __<_> ____<_>() { return ____<_>; }

    static void Main()
    {
        ((__<_>)____)(____<_>)();
    }
}

答案 1 :(得分:35)

这是一个示例程序,用于演示:

using System;

class Program
{
    static Action GetMethod()
    {
        return () => Console.WriteLine("Executing");
    }
    static void Main()
    {
        GetMethod()();
        Console.ReadKey();
    }
}

话虽如此,我不会在生产代码中这样做。这是非常意外的。


编辑:万一你想要看到更丑陋的东西...... [尤其是“()()[()=>{}]()”]:

using System;

class Program
{
    static void Main()
    {
        (new Program()).Confusion();
        Console.ReadKey();
    }

    public Action this[Action index]
    {
        get {
            return () => Console.WriteLine("Executing");
        }
    }

    Func<Program> GetInstance()
    {
        return () => this;
    }

    void Confusion()
    {
        // This is particularly ugly...
        GetInstance()()[()=>{}]();
    }
}

答案 2 :(得分:12)

您只需要一些自我引用,您可以根据需要多次调用它:

delegate Foo Foo();

class Program {
    static void Main(string[] args) {
        Foo f = null;
        f = () => f;
        // Add more "()" as you feel like...
        f()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()();
    }
}

答案 3 :(得分:9)

static void Foo()
{
    Console.WriteLine("Hello World!");
}

static Action Bar()
{
    return new Action(Foo);
}

static void Main()
{
    Func<Action> func = new Func<Action>(Bar);
    func()();

    Bar()();
}

打印

Hello World!
Hello World!

这样可行,因为func()Bar()返回Action委托,可以使用常规方法调用语法调用该委托。

答案 4 :(得分:2)

类似的东西:

delegate void FunctionA();
delegate FunctionA FunctionB();

void TestA() { }
FunctionA TestB() { return TestA; }

void Main()
{
   TestB()();
}

答案 5 :(得分:0)

如果你有一个函数返回一个你通常会附加到信号的委托,但是你想立即调用该函数,你可以使用这种语法。

答案 6 :(得分:0)

另外,请查看Bertrand Leroy发布的类似内容的博文:http://weblogs.asp.net/bleroy/archive/2010/03/30/a-c-implementation-of-the-callstream-pattern.aspx

但这实际上做了一些半有用的事情:)