Могу ли я иметь тип, который, ковариант, так и контравариант, т. Е. Полностью Fungible / изменчивый с Sub и Superys?
-
25-09-2019 - |
Вопрос
Могу ли я иметь тип (пока забыл его семантику), который может быть ковариантным, а также контравариантным?
Например:
public interface Foo<in out T>
{
void DoFooWith(T arg);
}
В блоге Эрика Липперта для мяса и картофеля дисперсии в C # 4.0, так как там мало, что охватывает адекватную почву на эту тему.
Я в любом случае попробовал, не только это не позволяет, но это говорит мне, что я пропускаю всю точку зрения. Мне нужно понять связь между только для чтения, только для записи и дисперсией.
Я думаю, у меня есть еще несколько чтений.
Но любые короткие, приглашающие ответы, вызывающие усилие, вызывающие.
Решение
Нет, вы не можете это сделать.
Предположим, что были законные. Вы делаете АН IFoo<Giraffe>
. Отказ Поскольку Ifoo Covariant в T, вы можете преобразовать его через Sypearfe ссылочную преобразование в IFoo<object>
. Отказ Так как это контравариант, вы можете преобразовать это в IFoo<Banana>
. Отказ Какая возможная семантика для IFoo<T>
Такое, что имеет смысл, чтобы иметь возможность преобразовать Ифоус из жирафов на ifoo of Bananas через ссылочную преобразование? Жирафы и бананы не имеют ничего общего, кроме как ссылочные типы. Вы не можете иметь метод на IFoo<Banana>
это возвращает банан, потому что на самом деле это может быть реализация IFoo<Giraffe>
; Как бы автор реализации узнал банану? Вы не можете иметь метод на IFoo<Banana>
это берет банан по той же причине; Ремонт IFoo<Giraffe>
ожидает, что вы передаете ему жираф.
Вот еще один способ взглянуть на него:
- «В T» означает (примерно) «T появляется только на входных положениях».
- «OUT T» означает (примерно) «T отображается только в выходных позициях».
Поэтому «в пределах т» будет означать ... Что? Как мы уже видели, это может означать только «T не отображаться вообще ни в одном методе или имуществе». Какой смысл сделать универсальный тип в T, где вы никогда не используете T?