我刚刚遇到了我认为是类型转换中的一个怪事。我有类似下面的代码:C#类型转换奇数 - 接口作为通用类型
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);
}
对我来说,这个作品使得无法投射更加神秘。
@ Mehrdad的答案是为什么。但是,而不是'foreach',你能不能把'FillMyClassSet()'的返回类型改为'HashSet'? –
JMD
2010-01-20 20:49:46