Puis-je avoir un type (pour l'instant oublier sa sémantique) qui peut être covariant ainsi que contravariant?Puis-je avoir un type à la fois covariant et contravariant, c'est-à-dire entièrement fongible/modifiable avec les types sub et super?
par exemple:
public interface Foo<in out T>
{
void DoFooWith(T arg);
}
Off sur le blog de Eric Lippert pour la viande et les pommes de terre de la variance dans C# 4.0 comme il y a peu d'autre part, qui couvre bien du terrain sur le sujet. Je l'ai essayé de toute façon, non seulement cela ne le permet pas, mais il me dit qu'il me manque tout le point. J'ai besoin de comprendre le lien entre lecture seule, écriture seule et variance. Je suppose que j'ai eu plus de lecture à faire.
Mais toutes les courtes réponses qui suscitent l'épiphanie sont les bienvenues.
En fait, les types génériques qui n'utilisent pas leurs arguments de type générique peuvent être extrêmement utiles. Les soi-disant «types fantômes» permettent d'écrire du code de telle manière que des opérations incorrectes peuvent être interdites statiquement. L'exemple canonique est probablement un type 'File', où le type 'T' code si le fichier autorise la lecture, l'écriture, ou les deux, même si les internes de la classe ne font jamais référence à' T'. –
kvb
Bien sûr, vous pourriez facilement violer l'avantage de sécurité des types fantômes si le type a été annoté à la fois covariant et contravariant, puisque vous pourriez alors convertir un fichier '' Fichier ', comme vous le notez. –
kvb
@kvb: En quoi est-ce différent de simplement créer un fichier de classe de base et des classes dérivées "WritableFile", "ReadableFile" et "ReadableAndWritableFile"? Pourquoi capturer quelque chose dans le système de type générique quand il pourrait simplement être capturé dans le système de type ordinaire? –