Я определил следующие типы делегатов. Один возвращает строку и один объект:
delegate object delobject();
delegate string delstring();
Теперь рассмотрим следующий код:
delstring a = () => "foo";
delobject b = a; //Does not compile!
Почему назначение недействительно?
Я не понимаю. Метод, который возвращает строку, должен быть смело рассмотрен как метод, который возвращает объект (поскольку строка является объектом).
В С# 4.0 работает следующий пример. Вместо использования делегатов я использую Func<TResult>
общий тип:
Func<string> a = () => "foo";
Func<object> b = a; //Perfectly legal, thanks to covariance in generics
Также: если я переписал его таким образом, он работает:
delobject b = () => a();
Но это не то же самое, что я хотел изначально. Теперь я создал новый метод, который вызывает другой.
Это не просто назначение, как показано в этом примере:
delint a = () => 5;
delobject b = a; //Does not work, but this is OK, since "int" is a value type.
delobject b = () => a(); //This will box the integer to an object.