1

以下は、C# の分散に関する私の理解をまとめたものです。エリック・リッパートによる分散有効性のための正確なルールに関する記事を読んだので、何が間違っているのか教えていただければ幸いです。

分散とは、ある型から別の型への変換 (または Eric Lippert が言うように射影) が、割り当ての互換性を保持する (共分散) か、逆にする (反分散) か、保持も逆にすることもできない (不変) という考えです。あれは; I が T の共変変換である場合 (T は型のセット)、T の任意の T1 および T2 型について、T1 が T2 に割り当て可能である場合、I<T1>は に割り当て可能I<T2>です。反変であれば、結果は元に戻ります。そして、私が不変だった場合、どちらにもI<T1>代入できI<T2>ず、反対にもなりません。

では、型が共変または反変であるとはどういう意味でしょうか? 分散は型の射影のプロパティではなく、型自体のプロパティではありません。

I<out T, in U>ジェネリック型が T で共変で U で反変であるとはどういう意味ですか?

また、反変妥当性はバリアント妥当性の方向を逆転させ、共変妥当性はバリアント妥当性の方向を逆転させるとはどういう意味ですか?

4

1 に答える 1

9

では、型が共変または反変であるとはどういう意味でしょうか? 分散は型の射影のプロパティであり、型自体のプロパティではありませんか?

はい、あなたはスポットです。まあ、あなたはほとんどスポットです。分散は、型の特定の関係に関する型の射影のプロパティです。

次のステートメントを検討してください。

  • T参照型から型にマップする射影は、割り当ての互換性IEnumerable<T>関係の方向を維持するため、その射影は共変です。

  • Tからへの射影IEnumerable<T>は T で共変です。

  • IEnumerable<T>で共変ですT

  • IEnumerable<T>は共変です。

4番目のものと言います。最初のものを意味します。「共変である」とは、射影が (からへ) 何であり、保存された関係が (代入の互換性) であるIEnumerable<T>かが文脈から明らかであることを前提としています。そのように言う方が簡単です。TIEnumerable<T>

あなたが言及した記事では、私は最初はこれよりもずさんです。基本的に「共変」は、「共変変換に何らかの形で関与できる」という意味で使用します。ただし、「共変的に有効」などの定義は正確です。それを「共変的に有効」と呼ぶと理解しにくくなる場合は、別の呼び方をしてください。

型 X は、ポインター、非ジェネリック、Frobby 要素型の配列、またはすべての "in" 型引数が Blobby であり、すべての "out" 型引数が Frobby であるジェネリック型である場合、Frobby 型であると言われます。 、および他のすべての型引数は Frobby と Blobby の両方です。ポインター、非ジェネリック、Blobby 要素型の配列、またはすべての "in" 型引数が Frobby で、すべての "out" 型引数が Blobby であり、すべての型引数が Blobby であるジェネリック型である場合、Blobby と呼ばれます。他の型引数は Frobby と Blobby の両方です。

そこでは、「共変」または「反変」という言葉をまったく使用せず、Frobby と Blobby の両方を正確に定義しています。

I<out T, in U>ジェネリック型が共変でTあり、反変であるとはどういう意味Uですか?

繰り返しますが、これは単なる短い形式です。最初の部分は、すべての fixedUの場合、参照型Tから へI<T, U>の射影が、割り当て方向の互換性を保持する射影であることを意味します。Xが と代入互換性がYあり、Zが任意の型である場合、はI<X, Z>と代入互換性がありI<Y, Z>ます。

反変部分についても同様ですが、現在Tは固定されており、射影は関係の方向を逆にしています。

また、「反変の妥当性はバリアントの妥当性の方向を逆転させる」とはどういう意味ですか?

つまり、共変妥当性のルールを読んで、反変妥当性のルールと比較すると、一連のルールが「逆になっている」だけで、ルールは基本的に同じであることがわかります。そのため、これを *コントラ* バリアンスと呼びます。

私のブログには分散に関する記事が 12 以上あります。このテーマに興味がある場合は、最初から読み始めることをお勧めします。

于 2013-04-26T04:31:25.937 に答える