10
votes

Question sur les génériques en C # comparer à Java

en Java, je peux spécifier générique avec Wildcard "?". Il est possible de créer une carte comme celle-ci:

mappe Code>. P>

Je travaille avec c # et j'ai besoin d'un dictionnaire > CODE> (Où? Peut être int, double, n'importe quel type). Est-ce possible dans c #? P>

EDIT: strong> p>

Exemple: p>

Dictionary<String, ISomeInterface<?>> _objs = new Dictionary<String, ISomeInterface<?>();

_objs.Add("Object1", new ObjectI());
_objs.Add("Object2", new ObjectII());
_objs.Add("Object3", new ObjectII());

foreach(var keyVal in _objs){
   Console.WriteLine(keyVal.Method());
}


2 commentaires

Je ne connais pas Java si beaucoup mais ne serait pas ? être identique à objet alors?


Oui, ? est objet . Ce qui est plus inattendu, c'est que n'importe quoi vous écrivez qu'il y a réellement objet , car Java's VM ne prend pas en charge les génériques, ils sont tous effacés à la compilation.


3 Réponses :


8
votes

NO.

Cependant, si vous utilisez C # 4, vous pouvez faire iSomeInterface covariant de sorte que isomeinterface sera convertible vers iSomeInterface . .

Si iSomeInterface a des méthodes qui prennent des paramètres de son paramètre de type (par opposition aux valeurs de retour), cela sera complètement impossible, car il vous permettrait alors de passer des objets arbitraires comme les paramètres. < / p>

EDIT : Dans votre cas spécifique, la meilleure solution consiste à faire imyinterface hériter d'une interface distincte non générique imyInterface et Déplacez tous les membres qui n'impliquent pas T à l'interface de base.
Vous pouvez ensuite utiliser un dictionnaire et vous n'aurez aucun problème.


0 commentaires

2
votes

Il est possible de limiter vos variables de type à certains types: xxx

Cependant, vous ne pouvez pas faire quelque chose comme: xxx < / p>


0 commentaires

2
votes

Pour l'utilisation que vous décrivez, vous pouvez utiliser une solution de contournement, avec un identificateur : xxx


0 commentaires