2010-05-27 32 views
3

Possible en double:
Why isn’t there generic variance for classes in C# 4.0?Pourquoi les classes de .NET 4 ne sont-elles pas covariantes?

En tant que programmeur novice j'ai quelques questions au sujet de la variance dans .NET 4. Pas tellement sur la façon dont cela fonctionne, mais pourquoi certaines choses sont pas variante et si d'autres personnes trouveraient cela utile.

Question 1:

Je sais que les interfaces et les délégués peuvent être covariante/contravariant dans .NET 4, mais pourquoi pas les classes? Donc, question 1:

List(of BaseClass) = List(of DerivedClass) 

Est-ce que c'est quelque peu dangereux? Cela ne serait-il pas utile?


Question 2:

Question 2 découle de la question 1, mais peut traiter plus de signatures que la variance. Supposons que j'ai une classe MustInherit avec un membre MustOverride:

Public MustInherit Class TestBase 
    Public MustOverride Property SomeClass as BaseClass 
End Class 

Dans la classe dérivée, pourquoi je ne peux pas passer outre SomeClass et retourner une classe dérivée de BaseClass? Est-ce dangereux? Est-ce juste que les signatures ne vérifient pas les relations d'héritage?

Public Class TestSpecific 
    Inherits TestBase 
    Public Overrides Property SomeClass as DerivedClass 
End Class 

Tout renseignement sur les raisons pour lesquelles cela n'est pas autorisé dans .NET 4 serait apprécié.

+0

Pour répondre à votre deuxième question (puisque la question était fermée pendant que je répondais): Vous pouvez le faire en ajoutant un peu de génériques à la classe de base. Java Enums l'utilise, par exemple, pour s'assurer que 'compareTo' ne peut être que des valeurs passées de cette énumération. Voir [ici] (http://madbean.com/2004/mb2004-3/) et [ici] (http://msmvps.com/blogs/jon_skeet/archive/2008/08/20/lessons-learned-from -protocole-tampons-partie-2-autoréférentielle-générique-types.aspx). –

Répondre

4

Eric Lippert answers the first part of you question here. En ce qui concerne la deuxième partie de votre question, la covariance du type de retour a été demandée à la fois pour C# et VB.NET - mais elle n'a pas encore été suffisamment priorisée par rapport aux autres fonctionnalités pour être publiée. Si je me souviens bien, cette fonctionnalité nécessiterait également des modifications du CLR à mettre en œuvre de manière appropriée. Pour expliquer pourquoi, je vais informer Eric Lippert que l'implémentation d'une fonctionnalité est gratuite, alors que l'implémentation d'une fonctionnalité nécessite le budget et le temps nécessaires pour la concevoir, la développer, la tester et la documenter. .. ce qui n'est pas gratuit. Une caractéristique doit être suffisamment valable pour suffisamment de personnes pour justifier les frais de création.

+0

Merci, lisez son post. Je suis confus quant à la raison pour laquelle le paramètre générique ne peut pas avoir de champs/propriétés "inscriptibles". Y a-t-il un exemple de la façon dont cela causerait un problème? Pour en revenir à étudier son exemple plus loin ... –

+2

Je n'aurais pas pu dire mieux moi-même. :-) –

+1

@Casey: Supposons que C est covariant dans T et C a une méthode vide M (T t). Vous avez une variable x de type C . Vous convertissez une valeur de type C en C et affectez-la à x. Vous pouvez maintenant appeler x.M (new Giraffe()) car, pour autant que le compilateur le sache, M prend un objet, pas un Tiger.Et puis le runtime se bloque quand il essaie de convertir une girafe à un tigre. C'est pourquoi il est illégal pour un type covariant d'avoir un T qui va "dans". –