我刚遇到了一个类型转换的奇怪问题。我有类似下面代码:
interface IMyClass { }
class MyClass: IMyClass { }
class Main
{
void DoSomething(ICollection<IMyClass> theParameter) { }
HashSet<MyClass> FillMyClassSet()
{
//Do stuff
}
void Main()
{
HashSet<MyClass> classSet = FillMyClassSet();
DoSomething(classSet);
}
}
当执行DoSomething(classSet)时,编译器报错称无法将HashSet<MyClass>强制转换为ICollection<IMyClass>。这是为什么呢?HashSet实现了ICollection,MyClass实现了IMyClass,为什么转换就不合法呢?
顺便提一下,这个问题并不难解决,虽然有点棘手。
void Main()
{
HashSet<MyClass> classSet = FillMyClassSet();
HashSet<IMyClass> interfaceSet = new HashSet<IMyClass>();
foreach(IMyClass item in classSet)
{
interfaceSet.Add(item);
}
DoSomething(interfaceSet);
}
对我来说,这个能够工作的事实使得无法投射更加神秘。
foreach
,而是将FillMyClassSet()
的返回类型更改为HashSet<IMyClass>
? - JMD