Явная реализация интерфейса с использованием автоматического свойства
Есть ли способ реализовать интерфейс, явно используя автоматическое свойство? Например, рассмотрите этот код:
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 работала - мне просто любопытно.)
Ответы
Ответ 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; }
}
}