我有一个名为“baseClass”的类。 从这个类我继承了一个类名“inheritedClass”(公共类inheritedClass:baseClass)
baseClass包含一个返回HashSet<baseClass>
的公共函数。从inheritedClass调用时,返回类型显然仍为HashSet<baseClass>
,但我需要HashSet<inheritedClass>
。
转换ala(HashSet<inheritedClass>
)returnValue,其中returnValue属于HashSet<baseClass>
类型不起作用。
有没有办法将HashSet-Type从baseClass转换为inheritedClass而不手动转换每个元素?
提前致谢, 弗兰克
答案 0 :(得分:2)
你真的是指标签中的C#吗? HashMap
是Java类型。它通常有两个类型参数而不是一个......
在C#中,泛型类总是不变的。 某些接口将在C#4中变种,但很少(只有那些 在输出位置使用type参数的那些,例如{ {1}}或仅在输入位置使用type参数,例如IEnumerable<T>
)。
如果您可以提供有关您情况的更准确信息,我们可能会帮助您提供一个简单的解决方案 - 特别是如果您可以使用LINQ及其IComparable<T>
方法。
编辑:好的,Cast<T>()
:
HashSet<T>
请注意,即使使用C#4,这也是必要的,因为编译器不知道HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
中的每个值都是baseSet
的实例 - 必须进行执行时检查。相反(从DerivedType
创建HashSet<BaseType>
将在C#4中工作。
进一步编辑:如果您只想使用HashSet<DerivedType>
,则不需要UnionWith
- 它需要HashSet<DerivedType>
。我建议你这样做:
IEnumerable<DerivedType>
答案 1 :(得分:1)
这是解决方案
//**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.}
}