Почему делегат не может обратиться к нестатическому методу при использовании в статическом методе?

Почему необходимо сделать функциональные ПОМЕХИ при использовании делегатов в 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;
    }
}
7
задан John Saunders 19 February 2010 в 19:31
поделиться

4 ответа

Он не "нужен". Но ваш метод Main является статическим, поэтому он не может вызвать нестатический метод. Попробуйте сделать что-то вроде этого (это не совсем хороший способ - вам действительно следует создать новый класс, но это не сильно изменит ваш пример):

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; 
    } 
}
12
ответ дан 6 December 2019 в 08:42
поделиться

Ваша функция должна быть статической, потому что вы вызываете ее из статического метода 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;
    }
}
8
ответ дан 6 December 2019 в 08:42
поделиться

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

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
ответ дан 6 December 2019 в 08:42
поделиться

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

1
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: