Pregunta

Tengo una clase llamada "BaseClass". A partir de esta clase que heredan una nombres de clase "inheritedClass" (inheritedClass clase pública: BaseClass)

La clase base contiene una función pública que devuelve un HashSet<baseClass>. Cuando se llama desde el inheritedClass, el tipo de retorno es, evidentemente, todavía HashSet<inheritedClass>, pero necesito un <=>.

Un ala de conversión (<=>) returnValue, donde returnValue es de tipo <=> no funciona.

¿Hay una manera de convertir el HashSet-Tipo de BaseClass a inheritedClass sin convertir cada elemento manualmente?

Gracias de antemano, Frank

¿Fue útil?

Solución

¿Realmente decir C # en las etiquetas? HashMap es un tipo Java. También tiene dos parámetros de tipo general en lugar de uno ...

En C #, clases genéricas son siempre invariables. Algunos interfaces de ser variante en C # 4, pero muy pocos (sólo aquellos que o bien solamente utiliza el parámetro de tipo en un positiion salida, por ejemplo < => o solamente utilizar el parámetro de tipo en una posición de entrada, por ejemplo, IEnumerable<T>).

Si usted puede proporcionar una información más precisa acerca de su situación, probablemente vamos a ser capaces de ayudar a llegar a una solución simple -. Especialmente si se puede usar LINQ con su método IComparable<T>

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

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

Tenga en cuenta que incluso con C # 4 sería necesario porque el compilador no sabe que todos los valores de HashSet<T> es una instancia de baseSet - tiene que haber un control en tiempo de ejecución. La inversa (la creación de un DerivedType de un HashSet<BaseType>) haría trabajo en C # 4.

hacer otras modificaciones: Si lo que desea es utilizar HashSet<DerivedType>, que no requiere una UnionWith - se requiere un IEnumerable<DerivedType>. Le sugiero que haga:

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

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

Otros consejos

Aquí está la solución

//**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.}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top