У меня есть книга , в которой объясняется контравариантность / ковариация следующим образом:
- делегат может иметь более конкретные типы параметров, чем его целевой метод. Это называется контравариантностью
- . Тип возвращаемого значения делегата может быть менее конкретным, чем тип возвращаемого значения его целевого метода. Это называется ковариацией
. И это пример.
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
, как показано в примере, но, похоже, я получаю тот же результат с sa = ActionObject
и o = RetrieveString
. (Я тестировал с Mono.)
new
для объяснения ковариации / контравариантности? объект x = Все, что наследуется от объекта
? Откуда взялось это странное название? Для чего это нужно?