Почему делегат не может ссылаться на нестатический метод при использовании в статическом методе? - PullRequest
7 голосов
/ 19 февраля 2010

Почему необходимо использовать функцию STATIC при использовании делегатов в C #?

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 ]

12 голосов
/ 19 февраля 2010

Это не «необходимо».Но ваш 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; 
    } 
}
8 голосов
/ 19 февраля 2010

Ваша функция должна быть статической, потому что вы вызываете из статического метода, 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;
    }
}
1 голос
/ 19 февраля 2010

Делегаты в основном следуют тем же правилам, что и методы.В приведенном примере ваш делегат должен быть статическим, потому что вы вызываете его из статического метода.В том же духе это не будет работать:

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;
    }
}

У вас может быть делегат с нестатическимспособ.

1 голос
/ 19 февраля 2010

В этом случае, поскольку вы не создаете экземпляр какого-либо класса, единственной альтернативой является статическая функция.Если бы вы создали экземпляр объекта типа Program, вы могли бы вместо этого использовать метод экземпляра.

0 голосов
/ 12 июня 2018

Нет необходимости создавать статический метод для передачи в делегате.

Но нестатический метод должен быть объявлен в другом классе и должен быть доступен с экземпляром этого класса.DN = новое DelegateName (экземпляр класса. Имя метода)

...