1

私はC#でCovarianceandを読んでいました。Contravariance

私の理解によれば、

クラスAnimalと派生クラスがあるCat場合、

CovarianceCat機能により、コンパイラは型オブジェクトからAnimal型オブジェクトへの受け渡しを受け入れるようになり、Contravariantその逆も同様です。

この行を読むまではすべて問題ありません。

「型共分散に注釈を付けるにはパラメーターを使用outし、反変にはinパラメーターを使用します」

私によると、outキーワードで装飾されたパラメーター => 関数内の特定のパラメーターに値を割り当てる必要があります。

キーワードを に、outキーワードをに関連付けるのに苦労しています。covarianceincontravariant

これら2つはどのように関連していますか? 両方の非常に簡単な例はありますか?

前もって感謝します。

4

4 に答える 4

2

C# 4.0 の共変性と反変性はどちらも、基本クラスの代わりに派生クラスを使用する機能を指します。in/out キーワードは、型パラメーターが入力と出力に使用されるかどうかを示すコンパイラ ヒントです。共分散

C# 4.0 の共分散は out キーワードによって支援され、out 型パラメーターの派生クラスを使用するジェネリック型が問題ないことを意味します。したがって

IEnumerable<Fruit> fruit = new List<Apple>();

Apple は果物なので、List は IEnumerable Contravariance として安全に使用できます

Contravariance は in キーワードであり、通常はデリゲートの入力タイプを示します。原則は同じです。つまり、デリゲートはより多くの派生クラスを受け入れることができます。

public delegate void Func<in T>(T param);

これは、Func がある場合、それを Func に変換できることを意味します。

Func<Fruit> fruitFunc = (fruit)=>{};
Func<Apple> appleFunc = fruitFunc;

基本的に同じものであるのに、なぜ共変/反変と呼ばれるのですか?

原則は同じですが、派生型からベースへの安全なキャストは、入力型で使用すると、派生型が少ない (Func) を派生型が多い (Func) に安全にキャストできます。それは果物を取り、リンゴも取ることができます。

于 2013-10-16T11:09:04.227 に答える
1

outキーワードはさまざまな目的を果たします。「ジェネリック型パラメーター」のコンテキストで指摘したように、「共分散」を機能させるキーワードとして機能します。別の用途は、refから複数の戻り値を取得するために使用するキーワードに似ていMethodます。

MSDNのout-keywordのドキュメントを見ると、キーワードの 2 つの目的outがリストされています。混乱しないように、コンテキストに基づいて異なる動作をします。

キーワードとの類似点も見つけることができますnew。また、異なる目的にも役立ちます。私の知る限り、彼らは

  1. クラスの新しいインスタンスを作成します。object obj = new object();
  2. 基本クラスのメソッドまたはプロパティを明示的にシャドウする。protected new void BaseMethod(){}
  3. ジェネリック パラメーターの制約。private void MyGenericMethod<T>(T t) where T:new()
于 2013-10-16T11:17:34.480 に答える
1

Microsoft の担当者は、機能名に明確でない名前を使用し、機能パラメーターに不適切なキーワードを使用することで、この機能を非常に複雑にしていると思います。

この名前は、ベクトルの共分散と反分散 (Mathe) から知っていますが、C# で初めて聞いたときは衝撃を受けました。

@JoesphAlbahari の著書 C# 4 In a Nutshell は、このトピックを 109-112 ページで非常によく説明しています。本当に読んでみることをお勧めします。

于 2013-10-16T11:49:36.713 に答える
1

outコンテキストキーワードです。つまり、配置によって意味が異なります。パラメータ修飾子
について話している。しかし、共分散と反分散に関してはそうではありません。キーワードがジェネリック インターフェイス定義で使用される場合、それはジェネリック修飾子であり、まったく別のものです。

于 2013-10-16T11:12:52.353 に答える