with method generic example delegate create array c# generics delegates method-group

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.