2010-10-11 2 views
11

Есть ли способ реализовать интерфейс явно с использованием автоматического свойства? Например, рассмотрите этот код:Явная реализация интерфейса с использованием автоматического свойства

namespace AutoProperties 
{ 
    interface IMyInterface 
    { 
     bool MyBoolOnlyGet { get; } 
    } 

    class MyClass : IMyInterface 
    { 
     static void Main(){} 

     public bool MyBoolOnlyGet { get; private set; } // line 1 
     //bool IMyInterface.MyBoolOnlyGet { get; private set; } // line 2 
    } 
} 

Этот код скомпилирован. Однако, если вы замените строку 1 на строку 2, она не компилируется.

(Это не то, что мне нужно, чтобы получить линию 2 работать - я просто любопытно.)

+0

Какие ошибки вы получаете? –

+2

Для «почему» - спросите себя ... как бы я его назначил? –

+0

Я получаю две ошибки: 1. «AutoProperties.MyClass.AutoProperties.IMyInterface.MyBoolOnlyGet.set» добавляет аксессуар, который не найден в члене интерфейса «AutoProperties.IMyInterface.MyBoolOnlyGet». 2. Модификатор 'private' недействителен для этого элемента – user181813

ответ

13

Действительно, что конкретное расположение (явная реализация интерфейса Property Get-только автоматическим реализованного имущества) ISN» t поддерживается языком. Итак, либо сделайте это вручную (с полем), либо напишите приватную авто-внедренную опору и прокси к ней. Но если честно, к тому времени, как вы сделали, что вы, возможно, также использовали поле ...

private bool MyBool { get;set;} 
bool IMyInterface.MyBoolOnlyGet { get {return MyBool;} } 

или:

private bool myBool; 
bool IMyInterface.MyBoolOnlyGet { get {return myBool;} } 
5

Проблема заключается в том, что интерфейс имеет только геттер и вы пытаетесь явно реализовать его с помощью getter и setter.
Когда вы явно реализуете интерфейс, явная реализация будет вызываться только тогда, когда вы ссылаетесь на тип интерфейса, поэтому ... если в интерфейсе есть только получатель, нет способа использовать установщик, поэтому нет смысла иметь сеттер там.

Это, например, будет скомпилирован:

namespace AutoProperties 
    { 
     interface IMyInterface 
     { 
      bool MyBoolOnlyGet { get; set; } 
     } 

     class MyClass : IMyInterface 
     { 
      static void Main() { } 

      bool IMyInterface.MyBoolOnlyGet { get; set; } 
     } 
    } 
+0

Я не вижу в этом объяснения, почему явно реализация интерфейса должна быть более ограниченной, чем неявная реализация. Возможно, имеет смысл, если неявная реализация приводит к компилятору C#, автоматически генерирующему для вас необходимый явный код реализации. Могли бы вы устранить здесь логический разрыв - что именно делает явным неявное отличие от явного, которое нарушает код OP? – binki

+0

Предположим, вы могли бы определить такой частный сеттер в явной реализации. Как бы вы его использовали? 'this.setter = ...' будет делегировать неявный сеттер (потому что это тип MyClass) и '((IMyInterface) this) .setter' будет терпеть неудачу, потому что IMyInterface не имеет определителя. –

+0

В этом весь смысл. Если явно реализованное свойство может быть автоматически реализовано, тогда мне не придется вручную реализовывать для него собственное хранилище. Я мог бы также полагаться на интерфейс, определяющий только геттер, чтобы скрыть мой собственный сеттер. Ну, есть проблемы с этим, я думаю, но, на мой взгляд, это в основном та же проблема, что и [неспособность переопределить только средство настройки или getter] (http://stackoverflow.com/a/6058526/429091). Вы должны сообщить компилятору, что только ваш сеттер или только ваш получатель реализует явный интерфейс. – binki

Смежные вопросы