为什么委托在静态方法中使用时不能引用非静态方法?

时间:2010-02-19 19:26:37

标签: c# .net visual-studio-2005 function delegates

为什么在C#中使用委托时需要使用STATIC函数?

class Program
{
    delegate int Fun (int a, int b);
    static void Main(string[] args)
    {
        Fun F1 = new Fun(Add);
        int Res= F1(2,3);
        Console.WriteLine(Res);
    }

   **static public int Add(int a, int b)** 
    {
        int result;
        result = a + b;
        return result;
    }
}

5 个答案:

答案 0 :(得分:12)

这不是“必要的”。但您的 Main 方法为static,因此无法调用非static方法。尝试这样的事情(这不是一个很好的做事方式 - 你真的应该创建一个新类,但它不会改变你的样本):

class Program 
{ 
    delegate int Fun (int a, int b); 
    void Execute()
    {
       Fun F1 = new Fun(Add); 
       int Res= F1(2,3); 
       Console.WriteLine(Res); 
    }

    static void Main(string[] args) 
    { 
        var program = new Program();
        program.Execute();
    } 

    int Add(int a, int b)
    { 
        int result; 
        result = a + b; 
        return result; 
    } 
}

答案 1 :(得分:8)

你的函数需要是静态的,因为你是从静态方法Main调用的。您可以使方法非静态:

class Program
{
    delegate int Fun (int a, int b);
    static void Main(string[] args)
    {
        Program p = new Program();       // create instance of Program
        Fun F1 = new Fun(p.Add);         // now your non-static method can be referenced
        int Res= F1(2,3);
        Console.WriteLine(Res);
    }

    public int Add(int a, int b)
    {
        int result;
        result = a + b;
        return result;
    }
}

答案 2 :(得分:1)

在这种情况下,因为您没有创建任何类的实例,所以唯一的选择是静态函数。如果要实例化Program类型的对象,则可以使用实例方法。

答案 3 :(得分:1)

代表基本上遵循与方法相同的规则。在提供的示例中,您的委托必须是静态的,因为您是从静态方法调用它。同样,这也行不通:

static void Main(string[] args)
{
    int Res = Add(3, 4);
    Console.WriteLine(Res);
}

public int Add(int a, int b)
{
    int result;
    result = a + b;
    return result;
}

但是,如果您将事物移动到这样的非静态上下文中:

class MyClass
{
    public MyClass()
    {
        Fun F1 = new Fun(Add);
        int Res = F1(2, 3);
        Console.WriteLine(Res);
    }

    public int Add(int a, int b)
    {
        int result;
        result = a + b;
        return result;
    }
}

您可以拥有一个非静态方法的委托。

答案 4 :(得分:-1)

无需创建传递委托的静态方法。

但非静态方法应该在不同的类中声明,并且必须使用该类的实例进行访问。

DelegateName DN = new DelegateName(类的实例。方法名称)