method - generics c#
No se puede convertir de ''grupo de métodos'' a error ''System.Action<object>'' (2)
La varianza no funciona de esa manera; necesitarías
DelegatedCall(obj => foo1((string)obj));
Como incluso en 4.0 no creerá que cada objeto es una cadena.
Tenga en cuenta que si fuera foo1(object) y Action<string> (es decir, al revés), probablemente funcionaría (en 4.0), ya que cada cadena es un objeto.
He creado la siguiente función:
public void DelegatedCall(Action<Object> delegatedMethod)
Y definió el siguiente método
public void foo1(String str) { }
Sin embargo, cuando intento llamar a DelegateCall con foo1 :
DelegatedCall(foo1);
... Recibo el siguiente error de compilación:
Argument 1: cannot convert from ''method group'' to ''System.Action<object>''
¿Cuál es la razón de este error y cómo puedo corregirlo? Desafortunadamente, foo1 a Action no es una opción.
DelegatedCall espera un delegado que tome cualquier object como argumento. Pero su función foo1 que está pasando a DelegatedCall solo puede hacer frente a un argumento de string . Por lo tanto, la conversión no es segura y, por lo tanto, no es posible.
Los parámetros de entrada son contra-variant , pero su código necesita covariance . (Ver Diferencia entre Covarianza y Contra-varianza ).
Puedes hacer que DelegatedCall genérico:
DelegatedCall<T>(Action<T> action)
... o tomar cualquier delegado:
DelegatedCall(Delegate action)
Pero luego implementarlo es feo y requiere reflexión. Tampoco verifica que la función tenga solo un parámetro en tiempo de compilación.