是否有可能编写像 – ()()?
我在某个地方读过一本电子书(我不得不再次寻找),通过使用委托,可以编写具有如下语法的代码:
()(); // 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
但是,这实际上做了半有用的东西:)