c# – 为什么接口类型的列表不能接受继承接口的意图?

c# – 为什么接口类型的列表不能接受继承接口的意图?,第1张

概述给出以下类型: public interface IPrimary{ void doBattle(); }// an ISecondary "is" an IPrimarypublic interface ISecondary : IPrimary { }// An implementation of ISecondary is also an IPrimary:internal c 给出以下类型:
public interface IPrimary{ voID dobattle(); }// an ISecondary "is" an IPrimarypublic interface ISecondary : IPrimary {  }// An implementation of ISecondary is also an IPrimary:internal class SecondaryImpl : ISecondary{    // required,since this is an IPrimary    public voID dobattle(){ }}

为什么我不能这样做?

List<IPrimary> List = new List<ISecondary>();

这导致以下编译错误:

Argument type ‘Sy@R_301_6563@.Collections.Generic.List’ is not assignable to parameter type ‘Sy@R_301_6563@.Collections.Generic.List’

我明白错误,我意识到有解决方法.我只是看不到任何明确的原因,直接转换是不允许的.包含在ISecondary列表中的值应该完全是IPrimary类型的(扩展)值.然后列表< IPrimary>列表< ISecondary>被解释为不相关的类型?

任何人都可以清楚地解释C#设计的原因吗?

一个稍微扩展的例子:我试图做类似以下事情时遇到这个问题:

internal class Program{    private static voID Main(string[] args)    {        // Instance of ISecondary,and by extention,IPrimary:        var mySecondaryInstance = new SecondaryImpl();        // This works as expected:        AcceptImpl(mySecondaryInstance);        // List of instances of ISecondary,which are also,// by extention,instances of IPrimary:        var mylistofSecondarIEs = new List<ISecondary> {mySecondaryInstance};        // This,however,does not work (results in a compilation error):        AcceptList(mylistofSecondarIEs);    }    // Note: IPrimary parameter:    public static voID AcceptImpl(IPrimary instance){  }    // Note: List of type IPrimary:    public static voID AcceptList(List<IPrimary> List){  }}
解决方法

Why can I not do this? List<IPrimary> List = new List<ISecondary>();

想像你有一个这样定义的方法:

public voID PopulateList(List<IPrimary> Listtopopulate){    Listtopopulate.Add(new Primary());  // Primary does not implement ISecondary!}

如果你要传递一个List< ISecondary>作为参数?

列表< ISecondary>的错误不能从List< IPrimary>分配编译器是让你摆脱这种麻烦的方法.

总结

以上是内存溢出为你收集整理的c# – 为什么接口类型的列表不能接受继承接口的意图?全部内容,希望文章能够帮你解决c# – 为什么接口类型的列表不能接受继承接口的意图?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241600.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存