namespace ConsoleApplication1
{
    public delegate void GreetingDelegate(string name);
    class Program
    {
        public void EnglishGreeting(string name)
        {
            Console.WriteLine("Good Moring "+name);
        }
        public void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好" + name);
        }
        private static void GreetingPeople(string name, GreetingDelegate MakeGreet) 
        {
            MakeGreet(name);
        }
        static void Main(string[] args)
        {
            GreetingPeople("Jimmy", EnglishGreeting);
            GreetingPeople("张三", ChineseGreeting);
            Console.ReadKey();
        }
    }
}比如EnglishGreeting和ChineseGreeting就会报错,一定要用static来声明,为什么呢?

解决方案 »

  1.   

    不需要namespace ConsoleApplication1
    {
        public delegate void GreetingDelegate(string name);
        class Program
        {
            public void EnglishGreeting(string name)
            {
                Console.WriteLine("Good Moring "+name);
            }
            public void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好" + name);
            }
            private static void GreetingPeople(string name, GreetingDelegate MakeGreet) 
            {
                MakeGreet(name);
            }
            static void Main(string[] args)
            {
                GreetingPeople("Jimmy", new Program
    ().EnglishGreeting);
                GreetingPeople("张三", new Program
    ().ChineseGreeting);
                Console.ReadKey();
            }
        }
    }
      

  2.   

    而且,如果你写过 WinForms 程序或者 ASP.NET 程序,那么就会发现事件处理函数就可以是非静态的。
      

  3.   

            static void Main(string[] args)
            {
                GreetingPeople("Jimmy", EnglishGreeting);
                GreetingPeople("张三", ChineseGreeting);
                Console.ReadKey();
            }你写的这两个方法根本没有办法编译,更不可能运行了!按照语法,对于这个static方法Main中的这两个没有对象标识的EnglishGreeting和ChineseGreeting,编译器就去找当前类型中的static方法了。因为语法就是这样要求的。如果你要调用某个对象的方法,那么你写的代码就应该告诉编译器它们来自于哪一个对象。
      

  4.   

    因为你是在Main函数中调用其他函数,而且只有一个类,Main又是static,一个static成员 是不能访问实例方法或者是实例字段的明白吗????