3

ウィキペディアから:

covariant : 広い (double) から狭い (float) に変換します。
contravariant : 狭い (float) から広い (double) に変換します。

.NET では、デリゲートの指定された戻り値の型の派生型を参照を保持するメソッドの戻り値の型にすることができるため、デリゲートには共分散があります。

同様に、デリゲートには反変性があります。これは、デリゲートの指定された引数 (パラメーター) の派生型を、参照を保持するメソッドに渡される引数の型にすることができるためです。

デリゲートに関連するこれら 2 つの定義では、どちらも共分散であるべきではありませんか? どちらの場合も、デリゲートは「より広い」型を期待していますが、「より狭い型」が与えられています。

MSDN の両方の例については、こちらを参照してください。

では、デリゲートに関連する場合、反変性という言葉は言語的にどのように意味を持つのでしょう?

4

2 に答える 2

3

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

最後の段落には、割り当ての互換性に関する簡潔な要約があります。

//言語的には、これはパラメーターと戻り値の意味で論理的であるように思われます。したがって、//前方または後方の方向は、関数に出入りすることに関するものです。

于 2011-03-08T18:47:51.767 に答える
2

SeanVDH からの回答に同意しません。彼は、「言語的には、これはパラメーターとリターンの意味で論理的であるように思われます。したがって、前方または後方の方向は、関数に出入りすることに関するものです」と述べています。

代わりに、これがここから来る答えだと思います:

共分散は割り当ての互換性を保持し、反分散はそれを逆にします。共分散は拡大変換であり、反分散は縮小変換です。

デリゲートをインスタンス化するときに、デリゲートで指定されたものより も派生した戻り値の型 (共分散)を持つメソッドを割り当てることができます。 また、デリゲートのパラメーター型より派生の少ないパラメーター型を持つメソッドを割り当てることもできます(反変性)。強調を追加

例:

static object GetObject() { return null; }
static void SetObject(object obj) { }

static string GetString() { return ""; }
static void SetString(string str) { }

static void Main()
{
    // Covariance. A delegate specifies a return type as object,
    // but I can assign a method that returns a string.
    Func<object> del = GetString;

    // Contravariance. A delegate specifies a parameter type as string,
    // but I can assign a method that takes an object.
    Action<string> del2 = SetObject;

    // But implicit conversion between generic delegates is not supported until C# 4.0.
    Func<string> del3 = GetString;
    Func<object> del4 = del3; // Compiler error here until C# 4.0.
}

この認識は、Eric Lippert の記事、Jon Skeet の著書C# In DepthのFast-tracked delegatesの章のCovariance and contravarianceセクション、および上記の引用元のリンクを読んだ結果です。

于 2011-03-14T22:02:28.110 に答える