Я пытаюсь понять, почему приведенный ниже код не компилируется. Ошибка, которую я получаю:
«MyClass» не реализует член интерфейса «IFace.Deliver()». 'MyClass.Deliver()' не может реализовать 'IFace.Deliver()', потому что он не имеет соответствующего возвращаемого типа 'IDoSomething'.
Обратите внимание, что я не прошу кого-то переформулировать ошибку компилятора и просто сказать мне то же самое, что и компилятор, или сказать: «... компилятор не поддерживает это», и я не спрашиваю, как чтобы «исправить» код, чтобы он скомпилировался (я могу сделать это, раскомментировав метод, показанный в примере).
Я пытаюсь понять причину того, что код не компилируется. Если бы кто-нибудь мог указать мне место в спецификации C#, посвященное этой проблеме, это было бы прекрасно.
На мой взгляд, код должен быть действительным, потому что:
- Это логически верно. Объект ThisOrThat ЯВЛЯЕТСЯ правильной реализацией IDoSomething (если нет какой-то тонкой проблемы, которую я упускаю).
- Это соответствует духу полиморфизма. Если метод объявлен как возвращающий интерфейс, он должен возвращать экземпляр конкретного класса, реализующего этот интерфейс. Почему тогда должно быть недопустимо, чтобы тот же метод был объявлен как возвращающий конкретный класс, реализующий интерфейс? Компилятор, безусловно, может проверить реализацию класса. (И да, я уже знаю, что компилятор не одобряет.)
Правда, причина №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();
//}
}