这是个问题。我想要完成的是类似于以下Java代码:
class A { }
class B extends A { }
public class Tests {
public static void main(String [] args) {
ArrayList<? extends A> lists = new ArrayList<B>();
}
}
(其中B extends A
表示B继承自A)
有可能吗?
由于
答案 0 :(得分:7)
没有。虽然C#4.0引入了接口的方差概念,但它并不是(也不可能)做你特别要求的。
在C#4.0中,您可以这样做:
<击> IEnumerable<object> foo = new List<int>();
击>
编辑:正如Marc所指出的,使用值类型和引用类型无法做到这一点。但是,由于我认为您的问题更多是关于广义A:B
而不是关于int:object
的问题,我认为这一点很重要。但是要准确,我的意思是C#4.0将允许 this :
IEnumerable<object> foo = new List<string>();
但你无法做你所描述的。也就是说,让我们考虑一下:
List<int> foo = new List<int>();
List<object> bar = foo;
bar.Add("baz");
现在,当我们尝试访问foo[0]
时会发生什么?您现在已经破坏了列表中的类型安全性。
答案 1 :(得分:4)
List<object>
最好的选择就是使用非通用的IList
:
IList list = new List<int>();
然而! 添加除int
以外的其他内容将导致运行时异常。