タグ付けされた質問 「covariance」

共分散、反変、および不変性は、何らかの変換(ジェネリック内での使用など)を受けたときに既存の型継承階層がどのように変化するかを示します。変換が元の階層の順序を維持する場合、それは「共変」です。それを逆にすると、それは「反変」です。それを壊すなら、それは「不変」です。


11
List <DerivedClass>をList <BaseClass>に変換します
基本クラス/インターフェースから継承できますが、List&lt;&gt; 同じクラス/インターフェースを使用して宣言できないのはなぜですか? interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // OK List&lt;A&gt; listOfA = new List&lt;C&gt;(); // compiler Error } } 回避策はありますか?

9
共分散と反分散の実世界の例
現実の世界で共分散と反変をどのように使用するかを理解するのに少し問題があります。 これまでのところ、私が見た唯一の例は、同じ古い配列の例です。 object[] objectArray = new string[] { "string 1", "string 2" }; それが他の場所で使用されているのを見ることができれば、開発中にそれを使用できるようにする例を見るとよいでしょう。
162 c#  c#-4.0  covariance 

8
配列は共変であるのにジェネリックは不変なのはなぜですか?
Joshua BlochのEffective Javaから、 配列は、2つの重要な点でジェネリック型と異なります。最初の配列は共変です。ジェネリックスは不変です。 共変とは、XがYのサブタイプの場合、X []もY []のサブタイプになることを意味します。文字列はオブジェクトのサブタイプなので、配列は共変です String[] is subtype of Object[] 不変とは、XがYのサブタイプであるかどうかに関係なく、 List&lt;X&gt; will not be subType of List&lt;Y&gt;. 私の質問は、なぜJavaで配列を共変にする決定をしたのですか?なぜ配列は不変なのにリストは共変なのかなどの他のSOの投稿があります。、しかしそれらはScalaに焦点を合わせているようで、私はついていけません。

4
共分散と反分散が値タイプをサポートしない理由
IEnumerable&lt;T&gt;あるコバリアントが、それは値型、ちょうどのみ参照型をサポートしていません。以下の単純なコードは正常にコンパイルされています。 IEnumerable&lt;string&gt; strList = new List&lt;string&gt;(); IEnumerable&lt;object&gt; objList = strList; しかし、からstringに変更するintと、コンパイルエラーが発生します。 IEnumerable&lt;int&gt; intList = new List&lt;int&gt;(); IEnumerable&lt;object&gt; objList = intList; その理由はMSDNで説明されています: 分散は参照型にのみ適用されます。バリアント型パラメーターに値の型を指定すると、その型パラメーターは、結果の構成型に対して不変になります。 私が検索したところ、値の型と参照の型の間のボクシングが原因であると述べたいくつかの質問が見つかりました。しかし、ボクシングが理由である理由はまだ私の心をはっきりさせませんか? 共分散と反変が値タイプをサポートしない理由と、ボクシングがこれにどのように影響するかについて、簡単で詳細な説明を誰かに教えてもらえますか?


4
(co-、contra-、in-)分散がどのように機能するのか、例ではコンパイルできないのはなぜですか?
この質問に続いて、誰かがScalaで次のことを説明できますか? class Slot[+T] (var some: T) { // DOES NOT COMPILE // "COVARIANT parameter in CONTRAVARIANT position" } 型宣言の+Tとの違いを理解してTいます(を使用するとコンパイルされますT)。しかし、その後どのように一つは、実際のものを作成するに頼ることなく、その型パラメータで共変であるクラス記述んunparametrizedを?以下がのインスタンスでのみ作成できることをどのように確認できますTか? class Slot[+T] (var some: Object){ def get() = { some.asInstanceOf[T] } } 編集 -これは次のようになりました: abstract class _Slot[+T, V &lt;: T] (var some: V) { def getT() = { some } } …

7
xからyへの共変配列の変換によりランタイム例外が発生する可能性があります
私が持っているprivate readonlyのリストLinkLabel(複数可IList&lt;LinkLabel&gt;)。後でLinkLabelこのリストにsを追加し、これらのラベルをFlowLayoutPanel次のように追加します。 foreach(var s in strings) { _list.Add(new LinkLabel{Text=s}); } flPanel.Controls.AddRange(_list.ToArray()); Resharperが私に警告を表示しますCo-variant array conversion from LinkLabel[] to Control[] can cause run-time exception on write operation。 私が理解するのを助けてください: これはどういう意味ですか? これはユーザーコントロールであり、ラベルを設定するために複数のオブジェクトからアクセスされないため、コードをそのままにしても影響はありません。

2
C#でのジェネリックとの共分散反分散を理解する問題
次のC#コードがコンパイルされない理由を理解できません。 ご覧のとおり、静的なジェネリックメソッドSomething with a IEnumerable&lt;T&gt;parameter(and Tis constrained to an IAinterface)があり、このパラメーターは暗黙的に次のように変換できません。IEnumerable&lt;IA&gt;。 説明は何ですか?(回避策を探すのではなく、なぜそれが機能しないのかを理解するためです)。 public interface IA { } public interface IB : IA { } public class CIA : IA { } public class CIAD : CIA { } public class CIB : IB { } public class CIBD : CIB { …

3
共分散、不変性、反変性は平易な英語で説明されていますか?
今日、私はJavaの共分散、反変(および不変性)に関するいくつかの記事を読みました。私は英語とドイツ語のウィキペディアの記事、およびIBMからの他のいくつかのブログ投稿と記事を読みました。 しかし、私はまだこれらが正確に何であるかについて少し混乱していますか?型とサブタイプの関係に関するもの、型変換に関するもの、メソッドがオーバーライドされるかオーバーロードされるかを決定するために使用されると言う人もいます。 だから私は平易な英語で簡単な説明を探しています。それは初心者に共分散と反変(そして不変性)が何であるかを示しています。簡単な例としてプラスポイント。

2
ジェネリックな共分散と逆分散はC#4.0でどのように実装されますか?
PDC 2008には参加しませんでしたが、C#4.0がジェネリック共分散と逆分散をサポートするように発表されたというニュースを聞きました。つまり、List&lt;string&gt;に割り当てることができますList&lt;object&gt;。それはどうでしょうか? Jon Skeetの著書C#in Depthでは、C#ジェネリックが共分散と逆分散をサポートしない理由が説明されています。それは主に安全なコードを書くためのものです。現在、C#4.0はそれらをサポートするように変更されました。それは混乱をもたらすでしょうか? C#4.0の詳細を説明できる人はいますか?

3
Javaでオーバーロードとオーバーライドの両方のケースで共分散と反分散を示す関数の例を挙げてください。[閉まっている]
休業。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前に閉鎖。 この質問を改善する Javaの共分散と反分散の良い例を示してください。


3
Scalaの不変セットがその型で共変ではないのはなぜですか?
編集:この質問を元の回答に基づいて書き直しました scala.collection.immutable.Setクラスは、その型パラメータの共変ではありません。どうしてこれなの? import scala.collection.immutable._ def foo(s: Set[CharSequence]): Unit = { println(s) } def bar(): Unit = { val s: Set[String] = Set("Hello", "World"); foo(s); //DOES NOT COMPILE, regardless of whether type is declared //explicitly in the val s declaration }

2
C#の共変および反変インターフェースを理解する
C#で読んでいる教科書でこれらに出くわしましたが、おそらく文脈が不足しているために、理解するのに苦労しています。 それらが何であるか、そしてそれらがそこに何のために役立つかについての良い簡潔な説明はありますか? 明確にするために編集: 共変インターフェース: interface IBibble&lt;out T&gt; . . 反変インターフェース: interface IBibble&lt;in T&gt; . .

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.