Вопрос

У меня есть класс с именем «baseClass».От этого класса я наследую имена классов «inheritedClass» (публичный класс inheritedClass:базовый класс)

Базовый класс содержит общедоступную функцию, которая возвращает HashSet<baseClass>.При вызове из inheritedClass тип возвращаемого значения, очевидно, остается неизменным. HashSet<baseClass>, но мне нужен HashSet<inheritedClass>.

Конверсия аля(HashSet<inheritedClass>)returnValue, где returnValue имеет тип HashSet<baseClass> не работает.

Есть ли способ преобразовать HashSet-Type из baseClass в inheritedClass без преобразования каждого элемента вручную?

Заранее спасибо, Фрэнк

Это было полезно?

Решение

Вы действительно имеете в виду C# в тегах? HashMap это тип Java.Кроме того, он обычно имеет два параметра типа, а не один...

В C# универсальные классы всегда инвариантны. Некоторый интерфейсы воля быть вариантами в C# 4, но очень немногими (только те, которые либо только используйте параметр типа в выходной позиции, например. IEnumerable<T>, или только используйте параметр типа во входной позиции, например. IComparable<T>).

Если вы предоставите более точную информацию о вашей ситуации, мы, вероятно, сможем помочь найти простое решение, особенно если вы сможете использовать LINQ с его Cast<T>() метод.

РЕДАКТИРОВАТЬ:Хорошо, с HashSet<T>:

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

Обратите внимание, что даже в C# 4 это было бы необходимо, поскольку компилятор не знает, что каждое значение в baseSet является примером DerivedType - должна быть проверка времени выполнения.Обратное (создание HashSet<BaseType> из HashSet<DerivedType>) бы работаю на С#4.

ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ:Если вы просто хотите использовать UnionWith, для этого не требуется HashSet<DerivedType> - это требует IEnumerable<DerivedType>.Я предлагаю вам сделать:

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

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

Другие советы

Вот решение

//**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.}
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top