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セクション、および上記の引用元のリンクを読んだ結果です。