7
votes

Pourquoi cela n'est pas possible dans les génériques C #?

Un collègue m'a pointé sur un cas étrange en C # (pas si sûr si cela est effectivement étrange cependant). de
Supposons que vous ayez un employé de classe. Si vous souhaitez créer une liste générique de type employé, vous pouvez simplement faire:

Employee x = new Employee();
List<typeof(x)> list = new List<typeof(x)>();


0 commentaires

6 Réponses :


30
votes

Non, l'équivalent de ce n'est pas em> disponible en Java. Vous ne pouvez pas utiliser "x.class" pour obtenir au type déclaré d'une variable.

En outre, typeof (x) code> ne fonctionne pas dans C # soit pour obtenir le type d'une variable - Il renvoie une référence code> code> pour le nom type em>, par exemple typeof (string) code> retournera une référence à l'objet code> code> associé au type system.string code> type. Cela équivaut à utiliser string.class code> en java. (Notez que, à nouveau, cela applique .Class code> à un nom de type, pas em> nom de variable.) P>

Les génériques Java ne supporte rien de tel que votre déclaration finale non plus. Si vous croyez qu'ils le font, veuillez donner un échantillon :) p>

Qu'est-ce que vous peut em> faire dans c # est d'utiliser le type d'inférence pour faire ce que vous voulez: p>

public static List<T> CreateListForSampleType<T>(T sample)
{
    return new List<T>();
}

...

Employee x = new Employee();
var list = CreateListForSampleType(x);


3 commentaires

Exemple de bon code. Que se passerait-il si vous utilisiez typeof dans la liste variable?


Jon, merci pour votre réponse détaillée! Et comme cela est compilé des informations sur l'heure, alors je suis sur la bonne voie. Parler de savoir s'il est utile ou non est quelque peu controversée cependant;).


Pendant que j'utilise le modèle Jon décrit ici, je n'aime pas cela. Je préférerais de grandement être capable de faire ce que l'OP essayait. Quand j'ai initialement découvert que je devais passer un exemple d'objet, j'ai été attristé.



2
votes

La raison en est que le typeOf () renvoie un objet de type, tout en ayant besoin d'un nom de type pour initialiser une liste à la compilation.


0 commentaires

1
votes

typeof est utilisé avec les noms de classe. Utilisez gettype () sur un objet, mais uniquement à l'exécution ...


0 commentaires

2
votes

Une partie de la réponse est que le type de x n'est pas disponible au moment de la compilation, c'est-à-dire qu'il pourrait être créé à l'aide de quelque chose comme ceci: xxx

Vous pouvez cependant créer une liste d'un Classe de base de ce que vous voulez stocker dans la liste (ou même une liste des objets "s).


0 commentaires

1
votes

Ce qui vous manque - IMHO - est la différence entre une référence de type statique au moment de la compilation et une référence de type Dinamyc (via une instance de System.Type) au moment de l'exécution.

typeof () et .getType () vous donne ce dernier. (Pour les types et les instances, respectivement)

J'espère que cela rend clair.

Le code de Jon Skeet ci-dessus est cool.


0 commentaires

0
votes

Vous ne pouvez pas trouver une raison de créer une liste vide depuis C # 3.0.

I Créez généralement des instances de liste uniquement avec une méthode tolistique d'un iNeumable, qui est à son tour générée à l'aide d'une déclaration de rendement, Concat (), une répétition (), Où () etc. xxx

, xxx


0 commentaires