#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(); } ?
Комментариев нет:
Отправить комментарий