Question

J'ai une classe nommée « BaseClass ». A partir de cette classe I héritera d'un nom de classe "inheritedClass" (inheritedClass public class: BaseClass)

Le BaseClass contient une fonction publique qui renvoie un HashSet<baseClass>. Lorsqu'il est appelé à partir du inheritedClass, le type de retour est évidemment encore HashSet<inheritedClass>, mais je besoin d'un <=>.

A ala de conversion (<=>) returnValue, où returnValue est de type ne fonctionne pas <=>.

Est-il possible de convertir le HashSet-type de BaseClass à inheritedClass sans convertir chaque élément manuellement?

Merci d'avance, Frank

Était-ce utile?

La solution

Voulez-vous dire vraiment C # dans les balises? Est un type HashMap Java. En outre, il a généralement deux paramètres de type plutôt que d'un ...

En C #, les classes génériques sont toujours invariant. Certains interfaces être variante C # 4, mais très peu (seulement ceux qui soit uniquement utiliser le paramètre de type dans une positiion de sortie, par exemple < =>, ou uniquement utiliser le paramètre de type dans une position d'entrée, par exemple, IEnumerable<T>).

Si vous pouvez fournir des informations plus précises sur votre situation, nous serons probablement en mesure d'aider à trouver une solution simple -. En particulier si vous pouvez utiliser LINQ avec sa méthode IComparable<T>

EDIT: D'accord, avec Cast<T>():

HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());

Notez que même avec C # 4 ce serait nécessaire parce que le compilateur ne sait pas que chaque valeur est une instance HashSet<T> de baseSet - il doit y avoir un contrôle d'exécution en temps. L'inverse (la création d'un DerivedType d'un HashSet<BaseType>) serait travail en C # 4.

PLUS EDIT: Si vous voulez juste utiliser HashSet<DerivedType>, qui ne nécessite pas une UnionWith - il faut un IEnumerable<DerivedType>. Je vous suggère de faire:

HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;

derivedSet.UnionWith(baseSet.Cast<DerivedType>());

Autres conseils

Voici la solution

//**Your BaseClass**
public class BaseClass<T> where T : BaseClass<T>
{
    public HashSet<T> GetHashSet()
    {
        HashSet<T> _hSet = new HashSet<T>();
        //do some work              
        //create a HashSet<T> and return;              
        return _hSet;
    }
}
//**Your Inherited/Derived Class**
public class InheritedClass : BaseClass<InheritedClass>
{
    //you have the method inherited as you need.}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top