77

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

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

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

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

4 回答 4

128

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

我找到了一个关于它的msdn 页面。

我不知道您是否可以为变量内联执行此操作,但对于您可以执行的类:
public class MyArray<T> where T: someBaseClass
或函数
public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass

我没有在页面上看到它,但使用where关键字它可能是一个变量。

于 2011-10-11T20:03:08.903 回答
8

查看CovarianceContravariance介绍.Net 4.0。但它只适用于interfaces现在。

例子:

IEnumerable<Base> list = new List<SubClass>();
于 2011-01-19T06:55:47.670 回答
7

没有确切的等价物(因为类型系统的工作方式与类型擦除和所有类型不同),但是您可以使用inout使用covariance 和 contravariance获得非常相似的功能。

于 2011-01-19T06:54:47.403 回答
6

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

    void putAll<K1, V1>(Dictionary<K1,V1> map) where K1 : K where V1 : V;
于 2015-07-29T01:05:35.327 回答