Подтвердить что ты не робот

Явная реализация интерфейса с использованием автоматического свойства

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

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 работала - мне просто любопытно.)

4b9b3361

Ответ 1

Действительно, эта конкретная компоновка (явная реализация свойства интерфейса get-only автоматически реализуемым свойством) не поддерживается языком. Так или сделайте это вручную (с полем), или напишите приватную автоматическую поддержку и прокси-сервер. Но, честно говоря, к тому времени, как вы это сделали, вы могли бы использовать поле...

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

или

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

Ответ 2

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

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

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

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

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