c# - 转换列表<T>(其中 T : IBar) to ICollection<IBar> fails

标签 c# list interface casting icollection

我有 class <强> T ,实现interface <强> IBar .

我有一个变量 list类型 List<T> .

提高我对语言的理解的两个问题:

  • 为什么这行不通?

    var foo = (ICollection <IBar>)list; // fails!

  • 如何解决(如果可能)?

最佳答案

Why doesn't this work?: var foo = (ICollection <IBar>)list;

假设T = Foo还有二等舱Foo2 : IBar .

然后你可以这样继续:

var foolist = (ICollection <IBar>)list;
foolist.Add(new Foo2());  // compiles, since Foo2 also implements IBar

砰!你在运行时有类型冲突,因为你试图添加 Foo2List<Foo> .

为避免这种情况,ICollection<Foo> 不是 ICollection<IBar> 的子类型, 即使 FooIBar 的子类型.这背后的理论是co- and contravariance .

关于c# - 转换列表<T>(其中 T : IBar) to ICollection<IBar> fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597136/

相关文章:

java - 重构使用流 API 的方法

c# - 如何让一个抽象类需要一个接口(interface)由后代类实现?

c# - Xamarin Xaml 动态创建控件?

c# - 强制重写另一个方法的方法被重写

python - 在Python中,如何计算电子邮件地址列表中 '1'的数量?

java - 接口(interface)内部继承对象类是可能的

Java 泛型 : using parameterized interface in method calls

c# - 尝试使用 HtmlAgilityPack 从网页中提取数据

c# - 使用 Entity Framework 作为数据访问层时,如何实现业务逻辑层?

java - 如何使用迭代器进行替换和计数