-2
votes

Quelle est la raison de cette erreur (héritante classe avec générique)?

Capture d'écran d'erreur Je crée un paquet de classes génériques, spécifiant progressivement le type générique de t strong> à exemple_of_storded_class fort>.

public class ModifiedList<example_of_stored_class> : AdvancedList<example_of_stored_class> 
{
    public void someMethod ()
    {
    }
}

public class AdvancedList<T> : List<T> where T : example_of_stored_class
{
    public AdvancedList ()
        {

        }
}
public class example_of_stored_class
{
    public string s = "Hi, i'm an example_of_stored_class!";
}


4 commentaires

Veuillez poster des erreurs comme texte, dans le corps de votre question. Les captures d'écran sont très gênantes pour ceux d'entre nous qui lisent votre question et qu'ils ne sont pas consultables.


Est r7_app votre classe ou votre espace de noms?


Avez-vous défini exemple_of_storded_class deux fois accidentellement, une fois dans un espace de noms global et une fois dans l'espace de noms r7_app ?


Notez que Classe publique modifiée définit un type générique nommé exemple_of_storded_class n'utilise pas le type de classe exemple_of_storded_class .


3 Réponses :


3
votes

La première apparition de exemple_of_stored_class Voici un paramètre type , car il apparaît sous des crochets d'angle après le nom de la classe dans une définition de classe: par les règles de C #, vous "Re disant que modifiedclass prend un paramètre de type nommé exemple_of_storded_class . Quelqu'un utilisant votre classe pourrait fournir tout type réel de ce paramètre (au moins, si le tout est compilé pour commencer): xxx

mais vous héritez cette classe générique d'une autre classe générique, où Vous fournitures exemple_of_stored_class comme la valeur du paramètre type de AdvancedList. Nous ne définissons pas ici la définition de la liste de jeunesse, de sorte que le type entre les crochets est interprété comme un type que vous souhaitez utiliser pour le paramètre Type.

Vous avez trouvé un moyen de faire exemple_of_storded_class moyenne deux choses différentes de la même ligne et que la confusion a abouti. xxx

ceci compilera: xxx

mais je soupçonne que vous voulez vraiment modifié pour hériter d'un Advancedlist avec le paramètre même type suivant: xxx

ou bien ce - Vous voulez que exemple_of_storded_class soit le seul paramètre de type sur l'image. C'est ce cas, une modificationListe n'est pas générique. Il hérit d'une classe générique "réalisée", qui a déjà un paramètre de type fourni. xxx


0 commentaires

4
votes

C'était:

public class ModifiedList : AdvancedList<example_of_stored_class>
{
    public void someMethod()
    {
    }
}


0 commentaires

1
votes

Vous ne pouvez pas écrire: xxx pré>

car dans la première partie de la déclaration, vous devez indiquer un paramètre générique utilisé pour "substitution". p>

comme cela ne peut pas être un type. p>

Vous devez écrire: p> xxx pré>

où T n'est pas un code défini Tapez comme une classe parce qu'il s'agit d'un artefact de modèle. p>

Le mot "modèle" désigne ici des modèles C ++, même les génériques C # ne sont pas identiques aux modèles C ++, mais des génériques historiques proviennent de modèles. P>

Paramètres de type générique (Guide de programmation C #) p>

Vouliez-vous simplement écrire: P>

ModifiedList : AdvancedList<example_of_stored_class>


1 commentaires

Manquez-vous classe publique préfixes?