#c_sharp
Допустим есть класс А, реализующий интерфейс I. interface I { } class A : I { } Теперь сделаем интерфейс с функцией foo, возвращающей I. interface IGetter { I foo(); } И попытаемся его реализовать. class Getter : IGetter { public A foo() { return new A(); } } На что получим ошибку компиляции мол «класс Getter не реализует интерфейс IGetter». И пойдём писать явную реализацию интерфейса, являющуюся обёрткой вызова foo(). I IGetter.foo() { return foo(); } Но зачем это? С какой целью стандарты не разрешают в качестве возвращаемого типа иметь тип, неявно преобразующийся к исходному? UPD: вопрос сугубо о причине описанного запрета. Пожалуйста, не предлагайте способы его обойти, их я и сам могу придумать с десяток.
Ответы
Ответ 1
С какой целью стандарты не разрешают в качестве возвращаемого типа иметь тип, неявно преобразующийся к исходному? С целью запрета ковариации и контрвариации для переопределений методов и реализаций интерфейсов. Более подробно описано в книге C# in Depth(2-е издание), подраздел 2.2.2. "Нехватка ковариантных типов возвращаемого значения".Ответ 2
А как насчёт public I foo() { return new A(); } ?
Комментариев нет:
Отправить комментарий