C#相当于Java的<! - ?扩展Base - >在泛型中

时间:2011-01-19 06:51:58

标签: c# .net generics inheritance extends

在Java中,我可以执行以下操作:(假设Subclass扩展Base):

ArrayList<? extends Base> aList = new ArrayList<Subclass>();

C#.NET中的等价物是什么?显然没有? extends关键字,这不起作用:

List<Base> aList = new List<Subclass>();

4 个答案:

答案 0 :(得分:90)

实际上有一个等价(有点)的where关键字。我不知道它是多么“接近”。我有一个功能,我需要做类似的事情。

我发现了一个msdn page

我不知道你是否可以内联变量,但对于一个类,你可以这样做:
public class MyArray<T> where T: someBaseClass
或功能
public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass

我没有在网页上看到它,但使用where关键字可能会有变量。

答案 1 :(得分:8)

查看Covariance引入的Contravariance.Net 4.0。但它现在只适用于interfaces

实施例

IEnumerable<Base> list = new List<SubClass>();

答案 2 :(得分:6)

没有完全等价物(因为类型系统不能以完全相同的方式工作,类型擦除和所有),但您可以使用in获得非常相似的功能和out使用covariance and contravariance

答案 3 :(得分:1)

如果您正在寻找两种类型的泛型,请看一下:

    void putAll<K1, V1>(Dictionary<K1,V1> map) where K1 : K where V1 : V;