有没有办法在C#中实现List <object> list = new List <int>()?</int> </object>

时间:2010-04-26 22:12:30

标签: c# generics

这是个问题。我想要完成的是类似于以下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)

有可能吗?

由于

2 个答案:

答案 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以外的其他内容将导致运行时异常。