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# – 为什么接口类型的列表不能接受继承接口的意图?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)