是否有可能编写像 – ()()?

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

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

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

你可以做得比现在的例子稍微好点,事实上…你可以任意扩展它:

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

而另外一个可怕的select是额外的ASCII艺术:

 class Test { delegate __ ___(); delegate ___ __(___ _); static void Main() { ___ _ = () => null; _ ()((_))(); } } 

请永远不要这样做。

编辑:最后一个 – 尽pipe它只是用下划线replace其他东西,尽可能重用名称:

 class Test { delegate void _(); delegate __<_> ___<_>(); delegate ___<_> __<_>(___<_> ____); static ___<_> ____<_>(___<_> ____) { return ____; } static __<_> ____<_>() { return ____<_>; } static void Main() { ((__<_>)____)(____<_>)(); } } 

这是一个示例程序,演示了这一点:

 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()()[()=>{}](); } } 

你只需要一点自引用,你可以随意多次调用它:

 delegate Foo Foo(); class Program { static void Main(string[] args) { Foo f = null; f = () => f; // Add more "()" as you feel like... f()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()(); } } 
 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()(); } 

版画

你好,世界!
你好,世界!

这是有效的,因为func()Bar()返回一个可以使用普通方法调用语法调用的Action委托。

就像是:

 delegate void FunctionA(); delegate FunctionA FunctionB(); void TestA() { } FunctionA TestB() { return TestA; } void Main() { TestB()(); } 

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

另外,请查看Bertrand Leroy撰写的类似博客文章: http : //weblogs.asp.net/bleroy/archive/2010/03/30/ac-implementation-of-the-callstream-pattern.aspx

但是,这实际上做了半有用的东西:)