Применяется ли ковариация / контравариантность к неявно конвертируемым типам, которые не реализуют общий интерфейс? - PullRequest
7 голосов
/ 19 июля 2011

Я сейчас читаю Ковариацию и Контравариантность в C #.

Все примеры содержат сведения об объектах, которые могут быть преобразованы, и отличаются из-за точности реализации интерфейса, например,

Где Circle : IShape

Ковариация: SomeType<Circle> as SomeType<IShape>
Контравариантность: SomeType<IShape> as SomeType<Circle>


Если TypeA и TypeB каждый имеет implicit converter, записанный для преобразования в другой тип, но не реализует какой-либо общий интерфейс , все еще правильно говорить о ковариации / контравариантности, когда имеем дело с преобразованием дженериков этих типов? Или это другая концепция?

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Отличная концепция. Ковариантность в смысле out (или контравариантность через in) всегда сохраняет референции, без какого-либо преобразования - просто та же ссылка в других (доказуемых) терминах. По этой же причине он не применяется к структурам, которые реализуют интерфейс, так как блок не сохраняет ссылки. Та же логика сохранения ссылок применяется к ковариантному назначению массивов ссылочных типов.

1 голос
/ 19 июля 2011

Типы не должны реализовывать общий интерфейс для того, чтобы быть совместными / противоположными.

Термины просто относятся к тому, приведет ли преобразование к потере информации или потенциальному увеличению информации,Это так же актуально при применении к унаследованным объектам, как и при применении к удваивающим и плавающим.до тех пор, пока существует неявный преобразователь.

...