2010-05-06 10 views
5
public class Program 
{ 
    delegate void Srini(string param); 

    static void Main(string[] args) 
    { 
     Srini sr = new Srini(PrintHello1); 
     sr += new Srini(PrintHello2);  //case 2:  
     sr += new Srini(delegate(string o) { Console.WriteLine(o); }); 
     sr += new Srini(delegate(object o) { Console.WriteLine(o.ToString()); }); //case 4: 
     sr += new Srini(delegate { Console.WriteLine(“This line is accepted,though the method signature is not Comp”); });//case 5 
     sr("Hello World"); 
     Console.Read(); 
    }  

    static void PrintHello1(string param) 
    { 
     Console.WriteLine(param); 
    } 

    static void PrintHello2(object param) 
    { 
     Console.WriteLine(param); 
    } 
} 

El compilador no se queja del caso 2 (ver el comentario), bueno, el motivo es directo ya que la cadena hereda del objeto. En la misma línea, ¿por qué se quejaba para este tipo de método anónimo (ver el comentario // 4 :) caso de queNo se puede asignar delegar un método anónimo con un tipo de parámetro menos específico

no puede convertir método anónimo para delegar tipo 'DelegateTest.Program.Srini' debido a que los tipos de parámetros no lo hacen coincide con los tipos de parámetro de delegado

donde como en el caso del método normal no es así? ¿O estoy comparando manzanas con naranjas? Otro caso es por qué está aceptando el método anónimo sin parámetros?

Respuesta

7

Varianza de compatibilidad de las conversiones de grupos de métodos (a partir de C# 2 - no lo hicieron en C# 1), las conversiones de función anónimas simplemente no lo hacen. Dado que cada vez que escribe una función anónima, puede escribir el parámetro apropiado, ¿por qué no hacerlo? No habría ningún beneficio en permitir la variación allí por lo que puedo ver, y haría las reglas más difíciles de hacer las cosas bien. (La varianza termina siendo bastante compleja en la especificación)

EDITAR: Un método anónimo sin una lista de parámetros es básicamente compatible con la lista de parámetros de cualquier delegado, siempre que no tenga los parámetros out. Básicamente es una forma de decir: "No me importan los parámetros". Es la una característica de métodos anónimos que las expresiones lambda no tienen :)

+0

Vaya, jon, es un error tipográfico, no tiene. Me refiero a // caso 5. He editado la pregunta. –

+0

@Srinivas: Bien, he editado la respuesta de manera apropiada. –

Cuestiones relacionadas