Почему необходимо сделать функциональные ПОМЕХИ при использовании делегатов в 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;
}
}
Он не "нужен". Но ваш метод 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;
}
}
Ваша функция должна быть статической, потому что вы вызываете ее из статического метода 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;
}
}
Делегаты в основном следуют тем же правилам, что и методы. В приведенном примере ваш делегат должен быть статическим, потому что вы вызываете его из статического метода. В том же духе это не сработает:
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;
}
}
У вас может быть делегат с нестатическим методом.
В этом случае, поскольку вы не создаете экземпляр какого-либо класса, единственной альтернативой является статическая функция. Если бы вы инстанцировали объект типа Program, то вместо него можно было бы использовать метод экземпляра.