无法从基础转换为通用T

时间:2018-03-07 00:57:44

标签: c# generics polymorphism

我需要转换List< Base>对象到列表< T>对象,其中T是从Base派生的类型之一,我知道这是肯定的。但是编译器说:

"无法转换为' Base'到''"

一些代码:

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

我怎么能得到这个?如何从List恢复派生实例,因为我在此运行时才有T信息?

谢谢!

1 个答案:

答案 0 :(得分:0)

定义List<Base>并不表示列表中的任何项目都来自Base。列表强制执行的唯一内容是其项目为Base或其派生类。它不强制任何项是继承的类,也不是任何特定的继承类。 (您知道列表包含的类型,但编译器不包含。)

你可以这样做:

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

这会将T类型的任何项目添加到List<T>

如果您确定列表中的每个项目都可以投放到T,那么您可以

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