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.