7

私は次のように反変性/共分散を説明する本を持っています:

  • デリゲートは、そのメソッドターゲットよりも具体的なパラメータタイプを持つことができます。これは反変性と呼ばれます
  • デリゲートの戻りタイプは、そのターゲットメソッドの戻りタイプよりも具体的でない場合があります。これは共分散と呼ばれます

そして、これは一例です。

using System;

delegate void StringAction(string s);
delegate object ObjectRetriever();

class Test
{
    static void Main()
    {
        StringAction sa = new StringAction(ActionObject);
        sa("hello");

        ObjectRetriever o = new ObjectRetriever(RetrieveString);
        object result = o();
        Console.WriteLine(result);
    }


    static string RetrieveString() {return "hello";}

    static void ActionObject(object o)
    {
        Console.WriteLine(o);
    }
}

共変性/反変性を使うには、例のように使う必要があると思いましたが、と newで同じ結果が得られるようです。(私はMonoでテストしました)。sa = ActionObjecto = RetrieveString

  • それでは、なぜ作家はnew共分散/反変性を説明するために使用するのですか?
  • 共分散/反変性のアイデアの背後にある理論は何ですか?それは単なる空想的な名前object x = Everything inherit from objectですか?この奇妙な名前はどこから来たのですか?それの使用法は何ですか?
4

4 に答える 4

21

私は次のように反変性/共分散を説明する本を持っています...

これは、分散の説明としてはあまり適切ではありません。「共変性」と「反変性」と呼ばれるものが正確に何であるかは完全に不明確なままです。

実際に異形であるものは決して言及されません。反変であるのは、型からその型のパラメーターを持つデリゲートへのマッピングです。共変性は、マッピング関係のプロパティです。

これを読んで、理解が深まるかどうかを確認してください。

http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx

共分散/反変性を使用するには、例に示すようにnewを使用する必要があると思いましたが、同じ結果が得られるようです...

C#2.0以降、「d=M」または「d=new D(M)」のいずれかを言うことができます。コンパイラーは、これらを同じものを記述する2つの異なる方法として認識します。

なぜライターは共分散/反変性を説明するためにnewを使用するのですか?

知らない。

共分散/反変性のアイデアの背後にある理論は何ですか?

理論は、順序関係がある場合、つまり、X x =(Y)yと言うことが合法である場合、XはYよりも大きく、順序関係を保持するマッピングがある場合、マッピングは次のようになります。共変。順序関係を逆にすると、反なります。

たとえば、動物がキリンよりも大きいタイプであるとします。したがって、タイプGiraffeのオブジェクトをタイプAnimalの変数に割り当てることができます。動物>キリン。

次に、タイプTからメソッドM-that-takes-aTおよびデリゲートタイプD-that-takes-aTへのマッピングを作成します。

メソッドM-that-takes-an-Animalを、タイプD-that-takes-a-Giraffeの変数に割り当てることができます。D(キリン)> M(動物)が動物>キリン。関係がになります; マッピング反変です。

それはオブジェクトを説明する単なる空想的な名前ですかx=すべてがオブジェクトから継承しますか?

いいえ。オブジェクトは他のほとんどすべてのタイプよりも大きいタイプであるため、この概念に関連しています。しかし、実際にバリアントとなるのは、サイズの関係を保持または逆転させるマッピングです。

これを読んでみて、それが役立つかどうかを確認してください。

http://blogs.msdn.com/b/ericlippert/archive/2009/11/30/what-s-the-difference-between-covariance-and-assignment-compatibility.aspx

この奇妙な名前はどこから来たのですか?

圏論。

于 2011-07-23T05:32:36.270 に答える
2

私が今まで見たC#の共変性/反変性を説明する最良の情報は、EricLippertによる一連のブログ投稿です。リストの一番下から始まる、11部構成のシリーズを参照してください。

時々読みづらいです。しかし、それはあなたが最初に尋ねることができるすべてを説明します。:)

これは実際のC#4.0実装の前に作成されたため、構文の説明は廃止されていますが、他のすべては説明どおりに実装されているようです。

于 2011-07-23T02:03:16.403 に答える
1

これはそれに関する素晴らしいウィキの記事です:ここに

じょうごを注ぐ方向と、じょうごの幅を適切なレベルに設定することが重要です...

于 2011-07-23T02:13:10.217 に答える
-1

最初の質問で何を意味するのかわかりません。

2番目の質問は、キャスティングを検討することを提案することで答えることができます。共変性とは、拡張クラスBを持つクラスAをクラスBとして格納できるようにすることです。

共変性

class A {
}

class B : public A {
}

B obj = new A();

共分散は、クラスAを拡張するがクラスAとして格納されるクラスBを許可します。

共分散

class A {
}

class B : public A {
}

A obj = new B();
于 2011-07-23T02:04:22.143 に答える