Ошибка компилятора С# при возвращении реализации интерфейса

Я пытаюсь понять, почему приведенный ниже код не компилируется. Ошибка, которую я получаю:

«MyClass» не реализует член интерфейса «IFace.Deliver()». 'MyClass.Deliver()' не может реализовать 'IFace.Deliver()', потому что он не имеет соответствующего возвращаемого типа 'IDoSomething'.

Обратите внимание, что я не прошу кого-то переформулировать ошибку компилятора и просто сказать мне то же самое, что и компилятор, или сказать: «... компилятор не поддерживает это», и я не спрашиваю, как чтобы «исправить» код, чтобы он скомпилировался (я могу сделать это, раскомментировав метод, показанный в примере).

Я пытаюсь понять причину того, что код не компилируется. Если бы кто-нибудь мог указать мне место в спецификации C#, посвященное этой проблеме, это было бы прекрасно.

На мой взгляд, код должен быть действительным, потому что:

  1. Это логически верно. Объект ThisOrThat ЯВЛЯЕТСЯ правильной реализацией IDoSomething (если нет какой-то тонкой проблемы, которую я упускаю).
  2. Это соответствует духу полиморфизма. Если метод объявлен как возвращающий интерфейс, он должен возвращать экземпляр конкретного класса, реализующего этот интерфейс. Почему тогда должно быть недопустимо, чтобы тот же метод был объявлен как возвращающий конкретный класс, реализующий интерфейс? Компилятор, безусловно, может проверить реализацию класса. (И да, я уже знаю, что компилятор не одобряет.)

Правда, причина №2 довольно расплывчата, и я не хочу вдаваться в философскую дискуссию. Я действительно ищу техническую причину, почему это не работает.

Как я уже сказал, я знаю, что мне нужно сделать, чтобы «исправить» это, но я действительно хочу понять, ПОЧЕМУ это не должно компилироваться так, как написано.

  interface IFace {
     IDoSomething Deliver();
  }

  interface IDoSomething {
  }


  class ThisOrThat : IDoSomething {
  }


  class MyClass : IFace {
     public ThisOrThat Deliver() {
        return new ThisOrThat();
     }

     // Uncomment the lines below to make it compile.
     //IDoSomething IFace.Deliver() {
     //   return Deliver();
     //}
  }

person Tom Baxter    schedule 03.08.2013    source источник
comment
Объясняется здесь: stackoverflow.com/questions/5709034/   -  person nhrobin    schedule 03.08.2013


Ответы (1)


Проблема в том, что «MyClass» не реализует интерфейс, потому что тип возврата «Deliver()» отличается от типа возврата «Deliver()» в интерфейсе. Вы можете утверждать, что технически он соответствует требованиям интерфейса из-за полиморфизма, но это не означает, что компилятор должен поддерживать эту функцию.

Какую проблему ты пытаешься решить? Почему «Deliver» в «MyClass» не может просто вернуть экземпляр «IDoSomething»? Или просто используйте перегрузку, как вы делали выше. Я не уверен, зачем вам нужна эта функция. Я думаю, что эта функция не поддерживается C#, потому что в ней нет необходимости.

person Hna    schedule 03.08.2013