ковариация / контравариантность в C #

У меня есть книга , в которой объясняется контравариантность / ковариация следующим образом:

  • делегат может иметь более конкретные типы параметров, чем его целевой метод. Это называется контравариантностью
  • . Тип возвращаемого значения делегата может быть менее конкретным, чем тип возвращаемого значения его целевого метода. Это называется ковариацией

. И это пример.

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 = Все, что наследуется от объекта ? Откуда взялось это странное название? Для чего это нужно?

7
задан prosseek 23 July 2011 в 14:30
поделиться