У меня может быть тип, это - оба, ковариантные и контравариантные, т.е. полностью взаимозаменяемый/изменяемый с sub и супер типами?

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

например:

public interface Foo<in out T>
{
    void DoFooWith(T arg);
}

Прочь к блогу Eric Lippert для сути и картофеля различия в C# 4.0, поскольку мало еще существует где угодно, который покрывает соответствующую землю на предмете.


Я испытал его так или иначе, мало того, что это не признает, что, но и говорит мне, что я пропускаю самое главное. Я должен понять ссылку между только для чтения, только для записи и различием.

Я предполагаю, что заставил еще некоторое чтение делать.

Но любой короткий, ответы стимулирования прозрения приветствуются, между тем.

6
задан SFun28 27 November 2016 в 23:56
поделиться

1 ответ

Нет, вы не можете этого сделать.

Предположим, что это законно. Вы создаете IFoo. Так как IFoo ковариантен в T, вы можете преобразовать его через типобезопасное преобразование ссылок в IFoo<объект>. Поскольку он контравариантен, его можно преобразовать в IFoo<банан>. Какова возможная семантика для IFoo, чтобы имело смысл преобразовывать IFoo жирафов в IFoo бананов через преобразование ссылок? Жирафы и Бананы не имеют ничего общего, кроме того, что являются ссылочными типами. Вы не можете иметь метод на IFoo, который возвращает банан, потому что на самом деле это может быть реализация IFoo; откуда автору реализации знать, что нужно выдать банан? Вы не можете иметь метод на IFoo, который принимает банан по той же причине; автор реализации IFoo ожидает, что вы передадите ему Жирафа.

Вот другой способ взглянуть на это:

  • "in T" означает (приблизительно) "T появляется только во входных позициях".
  • "out T" означает (приблизительно) "T появляется только в выходных позициях".

Поэтому "in out T" будет означать... что? Как мы уже видели, это может означать только "T вообще не появляется ни в одном методе или свойстве". Какой смысл создавать общий тип в T, если вы никогда не используете T?

10
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: