web-dev-qa-db-ja.com

C#のJavaの<?ジェネリックのBase>を拡張します

Javaでは、次のことができます(SubclassBaseを拡張すると仮定します):

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

C#.NETで同等のものは何ですか?明らかに? extendsキーワードはなく、これは機能しません。

List<Base> aList = new List<Subclass>();
58
Louis Rhys

実際には、同等の(並べ替えの)whereキーワードがあります。どれだけ「近い」のかわかりません。同様のことをするために必要な機能がありました。

msdn page が見つかりました。

変数に対してこのインラインを実行できるかどうかはわかりませんが、クラスに対しては実行できます:
_public class MyArray<T> where T: someBaseClass_
または関数
public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass

ページには表示されませんでしたが、whereキーワードを使用すると、変数に使用できる場合があります。

92
Raystorm

.Net 4.0で導入されたCovarianceおよびContravarianceを調べてください。ただし、現在はinterfacesでのみ機能します。

例:

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

exactに相当するものはありません(型システムはまったく同じように動作せず、型消去などすべてではないため) 共分散と反分散 を使用したinoutの同様の機能。

6
Mehrdad

2つのジェネリック型を探している場合は、これを見てください:

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