C# 无法从基转换为泛型T

C# 无法从基转换为泛型T,c#,generics,polymorphism,C#,Generics,Polymorphism,我需要将列表对象转换为列表对象,其中T是从Base派生的类型之一,我确信这一点。但编译器说: 无法从“基本”转换为“T” 一些代码: var rObj = JsonConvert.DeserializeObject<RootObject>(json); List<T> list = new List<T>(); var ent = rObj.Entities; // Entities is List<Base> foreach (var i

我需要将列表对象转换为列表对象,其中T是从Base派生的类型之一,我确信这一点。但编译器说:

无法从“基本”转换为“T”

一些代码:

var rObj = JsonConvert.DeserializeObject<RootObject>(json);

List<T> list = new List<T>();

var ent = rObj.Entities; // Entities is List<Base>

foreach (var i in ent)
    list.Add(i); // here I know that each i is a Base descendent, but the compiler reclams
我怎么能得到这个?我如何从列表中恢复派生实例,因为此时我只有T信息

谢谢

定义List并不表示列表中的任何项都是从Base派生的。列表唯一强制执行的是它的项是基类或派生类。它不强制任何项都是继承的类或任何特定的继承类。您知道列表包含的类型,但编译器不知道

您可以这样做:

listOfT.AddRange(listOfBase.OfType<T>());

你需要发布更多的代码。什么是T和RootObject?如果你没有像Mick说的那样限制在Base,我们需要了解T的定义,你可以编写foreach var i ent.Cast。仅仅加上我是行不通的,因为如果可以的话,你可以在猫的名单上加上一只狗,仅仅因为它们有相同的基本类动物,这是没有意义的。在施法过程中,你保证只添加猫的物体。就是这样!谢谢,@ckuri,它很管用!
listOfT.AddRange(listOfBase.Cast<T>());