Применяется ли ковариация / контравариантность к неявно конвертируемым типам, которые не реализуют общий интерфейс?
В настоящее время я читаю о ковариантности и контравариантности в C#.
Все примеры содержат подробности об объектах, которые могут быть преобразованы, и отличаются из-за точности реализации интерфейса, например
куда Circle : IShape
ковариации: SomeType<Circle> as SomeType<IShape>
контрвариация: SomeType<IShape> as SomeType<Circle>
Если TypeA
а также TypeB
у каждого есть implicit converter
написано для преобразования в другой тип, но не реализует какой-либо общий интерфейс, все еще правильно говорить о ковариации / контравариантности при работе с преобразованием обобщенных типов этих типов? Или это другая концепция?
2 ответа
Другая концепция. Ковариация в out
смысл (или противоположность через in
) всегда сохраняет ссылки, без каких-либо преобразований - просто одна и та же ссылка в других (доказуемых) терминах. По этой же причине он не применяется к структурам, которые реализуют интерфейс, так как блок не сохраняет ссылки. Та же логика сохранения ссылок применяется к ковариантному назначению массивов ссылочных типов.
Типы не должны реализовывать общий интерфейс, чтобы быть совместными / противоположными.
Термины просто относятся к тому, приведет ли конверсия к потере информации или потенциальному увеличению информации. Это относится как к унаследованным объектам, так и к двойным и плавающим.
Так что да, все еще правильно говорить о ко / противо-дисперсии, когда речь идет об объектах, у которых нет общего интерфейса, пока существует неявный преобразователь.