У меня может быть тип (на данный момент упущение его семантики), который может быть ковариантным, а также контравариантным?
например:
public interface Foo<in out T>
{
void DoFooWith(T arg);
}
Прочь к блогу Eric Lippert для сути и картофеля различия в C# 4.0, поскольку мало еще существует где угодно, который покрывает соответствующую землю на предмете.
Я испытал его так или иначе, мало того, что это не признает, что, но и говорит мне, что я пропускаю самое главное. Я должен понять ссылку между только для чтения, только для записи и различием.
Я предполагаю, что заставил еще некоторое чтение делать.
Но любой короткий, ответы стимулирования прозрения приветствуются, между тем.
Нет, вы не можете этого сделать.
Предположим, что это законно. Вы создаете IFoo
. Так как IFoo ковариантен в T, вы можете преобразовать его через типобезопасное преобразование ссылок в IFoo<объект>
. Поскольку он контравариантен, его можно преобразовать в IFoo<банан>
. Какова возможная семантика для IFoo
, чтобы имело смысл преобразовывать IFoo жирафов в IFoo бананов через преобразование ссылок? Жирафы и Бананы не имеют ничего общего, кроме того, что являются ссылочными типами. Вы не можете иметь метод на IFoo
, который возвращает банан, потому что на самом деле это может быть реализация IFoo
; откуда автору реализации знать, что нужно выдать банан? Вы не можете иметь метод на IFoo
, который принимает банан по той же причине; автор реализации IFoo
ожидает, что вы передадите ему Жирафа.
Вот другой способ взглянуть на это:
Поэтому "in out T" будет означать... что? Как мы уже видели, это может означать только "T вообще не появляется ни в одном методе или свойстве". Какой смысл создавать общий тип в T, если вы никогда не используете T?