Какое значение имеет контравариантность с лингвистической точки зрения в отношении делегатов? - PullRequest
3 голосов
/ 08 марта 2011

Из Википедия :

ковариант : преобразование из более широкого (двойного) в более узкое (плавающее).
контравариант : преобразованиеот более узкого (float) к более широкому (double).

В .NET делегат имеет ковариацию, поскольку он позволяет производным типам указанного возвращаемого типа делегата быть типом возврата метода, на который он ссылается.к.

Также делегат имеет противоречивость, поскольку он позволяет производным типам указанных аргументов (параметров) делегата быть типом аргумента, передаваемого в метод, на который он ссылается.

С этими двумя определениями, относящимися к делегатам, разве они не должны быть ковариацией обоих случаях делегат ожидает "более широкий" тип, но ему присваивается "более узкий тип".

См. здесь для примера обоих из MSDN.

Так как же слово контрвариантность имеет лингвистическое значение применительно к делегатам?

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

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

В последнем абзаце содержится краткое описание совместимости присваивания.

// С лингвистической точки зрения это представляется логичным в смысле параметров по сравнению с возвратом, поэтому направление //вперед или назад в отношении входа или выхода из функции.

2 голосов
/ 15 марта 2011

Я теперь не согласен с ответом от 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.
}

Это осознание было результатом чтения статьи Эрика Липперта, раздела Ковариантность и контравариантность Быстрых делегатов главы в книге Джона Скита C # In Depth , а также ссылка выше, откуда была взята цитата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...