C# Language Variantes de délégués


Exemple

Les délégués peuvent avoir des paramètres de type variant.

delegate void Action<in T>(T t);    // T is an input
delegate T Func<out T>();           // T is an output
delegate T2 Func<in T1, out T2>();  // T1 is an input, T2 is an output

Cela découle du principe de substitution de Liskov , qui stipule (entre autres) qu’une méthode D peut être considérée comme plus dérivée qu’une méthode B si:

  • D a un type de retour dérivé égal ou supérieur à B
  • D a des types de paramètres correspondants égaux ou plus généraux que B

Par conséquent, les affectations suivantes sont toutes de type sécurisé:

Func<object, string> original = SomeMethod;
Func<object, object> d1 = original;
Func<string, string> d2 = original;
Func<string, object> d3 = original;