DateTime
является типом значения.Преобразование типа значения в ссылочный тип (в данном случае object
) является преобразованием с изменением представления.Требуется бокс типа значения.Для ссылочных типов это не так.CLR реализует ссылку с указателями, и все указатели имеют одинаковый размер.Ссылка на производный класс просто интерпретируется как ссылка на базовый класс.По этой причине вы не можете использовать ковариацию подобным образом для типов значений.
Теоретически, компилятор мог бы сгенерировать промежуточную функцию, такую как:
object compilerGeneratedFunction(Test t) {
return (object)anonymousFunctionThatReturnsDateTime(t);
// The above cast can be implicit in C# but I made it explicit to demonstrate
// boxing that has to be performed.
}
Func<Test, DateTime> convertedFunction = compilerGeneratedFunction;
Но полученный делегатбудет указывать на совершенно другую функцию, вызывающую плохие вещи, такие как несоблюдение правил равенства делегатов в спецификации C #.Команда разработчиков отказалась от создания такой функции.