2013-08-03 3 views
0

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

«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(); 
    //} 
    } 
+0

Разъяснение здесь: http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance/5709191#5709191 – nhrobin

ответ

2

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

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