我在某个地方读了一本电子书(我很想再次找到),通过使用委托,可以编写具有如下语法的代码:
()(); // where delegate precedes this.
任何人都可以提供任何细节如何可能/在什么情况下会发生这种情况?
答案 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
但这实际上做了一些半有用的事情:)