代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

是否可以编写像-()()这样的语法?

c#
  •  47
  • GurdeepS  · 技术社区  · 14 年前

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

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

    有没有人能提供细节说明这是怎么可能的/在什么情况下会发生这种情况?

    7 回复  |  直到 14 年前
        1
  •  127
  •   Jon Skeet    14 年前

    你可以做得比目前给出的例子稍微好一点,事实上…你可以任意扩展它:

    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()
        {
            ((__<_>)____)(____<_>)();
        }
    }
    
        2
  •  35
  •   Reed Copsey    14 年前

    下面的示例程序演示了这一点:

    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()()[()=>{}]();
        }
    }
    
        3
  •  12
  •   Richard    14 年前

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

    delegate Foo Foo();
    
    class Program {
        static void Main(string[] args) {
            Foo f = null;
            f = () => f;
            // Add more "()" as you feel like...
            f()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()();
        }
    }
    
        4
  •  9
  •   dtb    14 年前
    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 可以使用普通方法调用语法调用的委托。

        5
  •  2
  •   csharptest.net    14 年前

    类似于:

    delegate void FunctionA();
    delegate FunctionA FunctionB();
    
    void TestA() { }
    FunctionA TestB() { return TestA; }
    
    void Main()
    {
       TestB()();
    }
    
        6
  •  0
  •   clahey    14 年前

    如果您有一个函数,该函数返回一个委托,然后您通常会附加到一个信号,但您只想立即调用该函数,则可以使用此语法。

        7
  •  0
  •   David Ebbo    14 年前

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

    但这实际上起到了半有用的作用:)