2015-08-30 2 views
1

Je dois créer une collection générique de collections génériques, qui doit contenir une classe générique. J'ai essayé dur, mais n'ai trouvé aucune réponse. Voici comment ma collection realizated ressemble: https://github.com/Infatum/PMC-Data-Model/blob/master/WTF/Position.cs C'est la collection de position d'un point de classe générique. J'ai besoin de créer une collection indexée de Positions appelées Matrix, collection indexée de Matrix appelée Container et une collection indexée de Containers, appelée Containers. Aidez-moi, s'il vous plaît!Créer une collection utilisateur personnalisée de collections

public class Matrix<T> : ICollection<T> where T : Position<T> 
{ 
    protected ArrayList matrix; 
    protected bool isReadOnly; 

    public Matrix() 
    { 
     matrix = new ArrayList(); 
    } 
// ... 
} 

Le problème: Le type 'T' ne peut pas être utilisé comme paramètre de type 'T' dans le type générique ou méthode 'Position'. Il n'y a pas de conversion de référence implicite de « T » à « WTF.Point »

Ceci est en fait la tâche qui m'a été donnée: https://docs.google.com/document/d/1ZYXXAjrh0OYNLUuFy0HT6ZuAzISIecE73cgA4QoRDlc/edit#heading=h.nwbuqfwpq3gk

+0

désolé, ma classe est trop longue, pour l'afficher ici donc j'ai partagé un lien sur mon projet avec toutes les classes nécessaires –

+1

Peut-être que vous pouvez réduire le code pour répondre à la question? Juste inclure les pièces qui vous causent des problèmes. –

+0

public class Matrix : ICollection où T: Position où le problème est: Le type 'T' ne peut pas être utilisé comme paramètre de type 'T' dans le type générique ou la méthode 'Position '. Il n'y a pas de conversion de référence implicite de 'T' à 'WTF.Point '. –

Répondre

2

Votre contrainte de type sur T est récursive - que je ne suis pas pense que tu le veux. (. Et ne ni le compilateur: La contrainte impose T être une sorte de Position<T> cela signifie que Position<T> est en fait Position<Position<T>> - qui viole votre contrainte de type sur l'argument générique de Position, il attend WTF.Point au lieu de Position)

Solution :

public class Matrix<T> : ICollection<Position<T>> 

Mais permettez-moi de préciser cela un peu plus: Dans un sens, vous voulez quelque chose comme

public class Matrix<T> : ICollection<T> where T : Position<U> 

donc il n'y a plus de récursivité. Vous voulez T être "une sorte de Position". Mais maintenant nous aurions un nouveau problème: d'où vient U (appelons-le le "type-élément")? Vous devez utiliser que comme argument de type générique de Matrix:

public class Matrix<U> : ICollection<T> where T : Position<U> 

Maintenant, la contrainte peut être replié directement dans le type d'interface, à savoir ICollection<Position<U>> donnant exactement la solution que j'ai donné ci-dessus (noms modulo).

+0

Maintenant, j'ai une nouvelle erreur: \t Le type ou le nom d'espace de noms 'T' est introuvable (manque-t-il une directive using ou une référence d'assembly?) –

+0

et ceci: 'Matrix ' ne définit pas le paramètre de type 'T ' –

+0

Cela semble que vous n'avez pas copié ma solution mais plutôt l'une des étapes explicatives ;-) Il n'y a pas de' Matrix 'dans ma solution – olydis