No se puede asignar delegar un método anónimo con un tipo de parámetro menos específico

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 comstackdor no se queja del caso 2 (vea el comentario), bueno, la razón es directa ya que la cadena hereda del objeto. En la misma línea, ¿por qué se queja de los tipos de métodos anónimos (ver el comentario // caso 4 🙂 que

No se puede convertir un método anónimo para delegar el tipo ‘DelegateTest.Program.Srini’ porque los tipos de parámetros no coinciden con los tipos de parámetros de delegates

¿Dónde, como en el caso del método normal, no? ¿O estoy comparando manzanas con naranjas? Otro caso es ¿por qué acepta el método anónimo sin parámetros?

Las conversiones de grupos de métodos admiten la varianza (a partir de C # 2 – no lo hicieron en C # 1), las conversiones de funciones 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í hasta donde puedo ver, y haría las reglas más difíciles de hacer 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 y cuando no tenga parámetros. Básicamente es una forma de decir: “No me importan los parámetros”. Es la única característica de los métodos anónimos que las expresiones lambda no tienen 🙂