Considere el siguiente programa de ejemplo: trabaja¿Debería una expresión de tipo 'dinámico' comportarse de la misma manera en tiempo de ejecución que una no dinámica del mismo tiempo de tipo de ejecución?
using System;
public delegate string MyDelegateType(int integer);
partial class Program
{
static string MyMethod(int integer) { return integer.ToString(); }
static void Main()
{
Func<int, string> func = MyMethod;
// Scenario 1: works
var newDelegate1 = new MyDelegateType(func);
newDelegate1(47);
// Scenario 2: doesn’t work
dynamic dyn = func;
var newDelegate2 = new MyDelegateType(dyn);
newDelegate2(47);
}
}
El primero de ellos como era de esperar - la conversión a MyDelegateType
tiene éxito. El segundo, sin embargo, arroja una RuntimeBinderException
con el mensaje de error:
No se puede convertir implícitamente el tipo 'System.Func < int, cadena >' a 'MyDelegateType'
¿Hay algo en el C# especificación que permite este comportamiento, o es un error en el compilador C# de Microsoft?
La raíz del problema es que los grupos de métodos están sin tipo, ¿no? Introducir un CaseDelegate, que se puede invocar con diferentes sobrecargas, puede ser interesante, aunque requeriría muchos tipos diferentes para cada posible combinación de sobrecargas. – configurator