Domanda

Ho una classe denominata "BaseClass". Da questa classe ho ereditare una nomi di classe "inheritedClass" (inheritedClass public class: BaseClass)

Il BaseClass contiene una funzione pubblica che restituisce un HashSet<baseClass>. Quando viene chiamato dal inheritedClass, il tipo di ritorno è ovviamente ancora HashSet<inheritedClass>, ma ho bisogno di un <=>.

Un ala di conversione (<=>) returnValue, dove returnValue è di tipo <=> non funziona.

C'è un modo per convertire il HashSet-Type da BaseClass a inheritedClass senza convertire manualmente ogni elemento?

Grazie in anticipo, Frank

È stato utile?

Soluzione

Vuoi davvero dire C # nei tag? HashMap è un tipo Java. Inoltre ha generalmente due parametri di tipo piuttosto che uno ...

In C #, classi generiche sono sempre invarianti. Alcuni interfacce essere variante in C # 4, ma pochissimi (solo quelle che o solo utilizza il parametro di tipo in un positiion uscita, ad esempio < => o solo utilizzare il parametro di tipo in una posizione di ingresso, ad esempio IEnumerable<T>).

Se è possibile fornire informazioni più precise sulla tua situazione, saremo probabilmente in grado di contribuire a trovare una soluzione semplice -. Specialmente se si può usare LINQ con il suo metodo IComparable<T>

EDIT: Okay, con Cast<T>():

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

Si noti che anche con C # 4 ciò sarebbe necessario perché il compilatore non sa che ogni valore in HashSet<T> è un esempio di baseSet - ci deve essere un controllo di esecuzione in tempo. Il contrario (la creazione di un DerivedType da un HashSet<BaseType>) farebbe lavoro in C # 4.

ULTERIORI EDIT: Se si desidera utilizzare HashSet<DerivedType>, che non necessita di un UnionWith - richiede una IEnumerable<DerivedType>. Vi suggerisco di fare:

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

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

Altri suggerimenti

Ecco la soluzione

//**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.}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top