2010-02-19 12 views
5

¿Por qué es necesario hacer una función ESTÁTICA mientras se usan delegados en C#?¿Por qué un delegado no puede hacer referencia a un método no estático cuando se usa en un método estático?

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

¿Está tratando de hacer referencia a él en un contexto estático desde Main? – captncraig

+2

Niego la premisa de la pregunta; es * no * necesario para que el método sea estático. Es necesario proporcionar suficiente información al delegado para llamar con éxito al método; para métodos no estáticos, que incluye proporcionar la instancia que recibe la llamada al método no estático. –

Respuesta

11

No es "necesario". Pero su método Principal es static, por lo que no puede llamar a un método que no sea static. Intentar algo como esto (esto no es realmente una buena manera de hacer las cosas, que realmente debería crear una nueva clase, pero no cambia su muestra mucho):

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

Buen trabajo desaprobar tu propio reclamo con código. Claramente Main (un método estático) se refiere a Execute (un método de instancia) llamándolo. La declaración correcta sería "Para que un método o método estático de otra clase se refiera a un método de instancia, debe proporcionar la instancia al hacerlo". Los métodos de instancia dentro de la misma clase también deben proporcionar una instancia al referirse a un método de instancia (verifique el IL para ver esto), pero el compilador de C# predeterminado es "este" si no especifica uno. –

8

Su función debe ser estática, porque estás llamando desde un método estático, Main. Puede hacer que el método no estático:

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

Puedes hacer eso. Hay una gran pregunta de si deberías. :) – pdr

+2

@pdr: ?? La pregunta es por qué el método tiene que ser estático. Mi respuesta es que no tiene que ser así, y lo demuestra. – Amy

1

En este caso, debido a que no está creando una instancia de cualquier clase, la única alternativa es una función estática. Si instanciara un objeto de tipo Programa, entonces podría usar un método de instancia en su lugar.

1

Los delegados básicamente siguen las mismas reglas que los métodos. En el ejemplo proporcionado, su delegado debe ser estático porque lo está llamando desde un método estático. En el mismo sentido, esto no funcionará:

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

Sin embargo si nos cambiaron las cosas en un contexto no estático como sigue:

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

Usted puede tener un delegado con un método no estático.

+0

Eso no es cierto, puede delegar a un método no estático desde un contexto estático. P.ej. MyDelegate del = foo.Bar; es válido incluso si Bar no es estático y la asignación está en un contexto estático. –

Cuestiones relacionadas