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

В настоящее время я читаю о ковариантности и контравариантности в C#.

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

куда Circle : IShape

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


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

2 ответа

Решение

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

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

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

Так что да, все еще правильно говорить о ко / противо-дисперсии, когда речь идет об объектах, у которых нет общего интерфейса, пока существует неявный преобразователь.

Другие вопросы по тегам