为代理分配方法时为什么不能添加括号?

时间:2009-09-29 20:42:50

标签: c# delegates

在将方法名称分配给委托类型时,我不能在我的方法名称后面添加括号的原因是什么。

这是代码:

public delegate Simple Simple(); //Create a delegate that returns its own type.

class Program
{
    public class Exercise
    {
        public static Simple Welcome()
        {
            Console.WriteLine("Welcome!");
            return null;

        }
    }
    static void Main(string[] args)
    {
        Simple msg;
        msg = Exercise.Welcome(); //Since Welcome returns Simple, I can execute it.

        msg();
        Console.Read();
    }
}

3 个答案:

答案 0 :(得分:13)

它允许编译器将方法调用与对方法组的引用区分开来。如果添加括号,编译器将调用该方法并使用该方法调用的返回值,而不是方法组本身。

答案 1 :(得分:4)

因为()执行该方法。就像你自己说的那样,你要分配它,而不是执行它。如果您在指定的位置使用了括号,则表示您将分配执行方法的结果,而不是指定方法。

答案 2 :(得分:4)

考虑以下代码:

delegate Foo Foo(); // yes, this is legal - a delegate to method that returns
                    // the same kind of delegate (possibly to a different method,
                    // or null)

class Program
{
    static Foo GetFoo() { return null; }

    static void Main()
    {
         Foo foo;

         foo = GetFoo;   // assign a delegate for method GetFoo to foo

         foo = GetFoo(); // assign a delegate returned from an invocation
                         // of GetFoo() to foo
    }
}

希望它清楚地表明为什么括号必须是重要的。