将列表<派生类>转换为列表<BaseClass>

将列表<派生类>转换为列表<BaseClass>

虽然我们可以从基类/接口继承,但为什么我们不能声明List<>使用相同的类/接口?

interface A{ }class B : A{ }class C : B{ }class Test{
    static void Main(string[] args)
    {
        A a = new C(); // OK
        List<A> listOfA = new List<C>(); // compiler Error
    }}

有绕道吗?


白板的微信
浏览 435回答 3
3回答

汪汪一只猫

完成这项工作的方法是迭代列表并转换元素。这可以使用ConvertAll来完成:List<A>&nbsp;listOfA&nbsp;=&nbsp;new&nbsp;List<C>().ConvertAll(x&nbsp;=>&nbsp;(A)x);您还可以使用Linq:List<A>&nbsp;listOfA&nbsp;=&nbsp;new&nbsp;List<C>().Cast<A>().ToList();

犯罪嫌疑人X

首先,停止使用无法理解的类名,如A,B,C。使用动物,哺乳动物,长颈鹿,或食物,水果,橘子或其他什么关系是明确的。那么,你的问题是“为什么我不能将长颈鹿的列表分配给动物类型列表的变量,因为我可以将长颈鹿分配给动物类型的变量?”答案是:假设你可以。那又会有什么问题呢?你可以把老虎加到动物名单上。假设我们允许你把长颈鹿的列表放在一个包含动物列表的变量中。然后你试着把一只老虎加到这个名单上。会发生什么?你想让长颈鹿的名单上有老虎吗?你想要坠机吗?还是希望编译器首先通过使分配非法来保护您不受崩溃的影响?我们选择后者。这种转换被称为“协变”转换。在C#4中,我们将允许您在接口和委托上进行协变转换当已知转换始终是安全的时..有关详细信息,请参阅我关于协方差和反方差的博客文章。(这周的星期一和星期四都会有一个关于这个话题的新话题。)
打开App,查看更多内容
随时随地看视频慕课网APP