C#将List <ObjBase>转换为List <Obj>

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

您可以使用CastToList从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>.