And*_*nZA 26 c# generics inheritance casting list
我为什么不能投出List<ObjBase>的List<Obj>?为什么以下不起作用:
internal class ObjBase
{
}
internal class Obj : ObjBase
{
}
internal class ObjManager
{
internal List<Obj> returnStuff()
{
return getSomeStuff() as List<Obj>;
}
private List<ObjBase> getSomeStuff()
{
return new List<ObjBase>();
}
}
Run Code Online (Sandbox Code Playgroud)
相反,我必须这样做:
internal class ObjBase
{
}
internal class Obj : ObjBase
{
}
internal class ObjManager
{
internal List<Obj> returnStuff()
{
List<ObjBase> returnedList = getSomeStuff();
List<Obj> listToReturn = new List<Obj>(returnedList.Count);
foreach (ObjBase currentBaseObject in returnedList)
{
listToReturn.Add(currentBaseObject as Obj);
}
return listToReturn;
}
private List<ObjBase> getSomeStuff()
{
return new List<ObjBase>();
}
}
Run Code Online (Sandbox Code Playgroud)
我在Visual Studio 2008中收到以下错误(为了便于阅读而缩短):
无法通过引用转换,装箱转换,取消装箱转换,换行转换或空类型转换将类型"列表"转换为"列表"
谢谢.
RaY*_*ell 35
您可以使用Cast和ToList从System.Linq的扩展方法有这样的一条线.
代替
internal List<Obj> returnStuff()
{
return getSomeStuff() as List<Obj>;
}
Run Code Online (Sandbox Code Playgroud)
做这个:
internal List<Obj> returnStuff()
{
return getSomeStuff().Cast<Obj>().ToList();
}
Run Code Online (Sandbox Code Playgroud)
Joa*_*uer 10
我只能从Java视图中描述"问题",但是我知道这个方面在C#和Java中都是相同的:
A List<ObjBase>不是a List<Obj>,因为它可能包含一个ObjBase不是Obj对象的对象.
周围的其他方式List<Obj>可以不被转换为List<ObjBase>,因为前者保证接受的Add()与呼叫ObjBase参数,后者将不接受!
因此,要总结:即使Obj是-一个ObjBase一个List<Obj>是不是一个List<ObjBase>.
| 归档时间: |
|
| 查看次数: |
59822 次 |
| 最近记录: |