Могу ли я иметь тип, который, ковариант, так и контравариант, т. Е. Полностью Fungible / изменчивый с Sub и Superys?

StackOverflow https://stackoverflow.com/questions/2809932

Вопрос

Могу ли я иметь тип (пока забыл его семантику), который может быть ковариантным, а также контравариантным?

Например:

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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top