Можно ли использовать свойство auto с явной реализацией интерфейса? [dубликат]

Вот мои методы с обработкой / комментариями исключений, которые я разработал на основе нескольких ответов в этом сообщении.

  1. Получает домен, к которому подключен компьютер.
  2. Возвращает только имя домена, если пользователь действительно зарегистрирован в учетной записи домена. /// & lt; summary & gt; /// Возвращает домен зарегистрированного пользователя. /// Поэтому, если компьютер подключен к домену, но пользователь входит в локальную учетную запись. String.Empty будет возвращен. /// Relavant StackOverflow Post: http://stackoverflow.com/questions/926227/how-to-detect-if-machine-is-joined-to-domain-in-c /// & lt; / summary & gt; /// & lt; seealso cref = "GetComputerDomainName" / & gt; /// & lt; возвращает & gt; Доменное имя, если пользователь подключен к домену, String.Empty, если нет. & lt; / returns & gt; static string GetUserDomainName () {строка domain = String.Empty; try {domain = Environment.UserDomainName; string machineName = Environment.MachineName; if (machineName.Equals (домен, StringComparison.OrdinalIgnoreCase)) {domain = String.Empty; }} catch {// обрабатывать исключение, если требуется, в противном случае возвращает null} return domain; } /// & lt; summary & gt; /// Возвращает домен, к которому подключен компьютер. Примечание: если пользователь зарегистрирован как локальная учетная запись, домен компьютера все еще возвращается! /// & lt; / summary & gt; /// & lt; seealso cref = "GetUserDomainName" / & gt; /// & lt; returns & gt; Строка с именем домена, если она соединена. String.Empty, если это не так. & Lt; / returns & gt; static string GetComputerDomainName () {строка domain = String.Empty; try {domain = System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain (). Имя; } catch {// При необходимости обработать исключение. } return domain; }
12
задан skaffman 11 October 2010 в 10:32
поделиться

2 ответа

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

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

или:

  private bool myBool;  bool IMyInterface.MyBoolOnlyGet {get {return myBool;}}  
14
ответ дан Marc Gravell 15 August 2018 в 15:55
поделиться

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

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

  пространство имен AutoProperties {интерфейс IMyInterface {bool MyBoolOnlyGet {get;  задавать;  }} class MyClass: IMyInterface {static void Main () {} bool IMyInterface.MyBoolOnlyGet {get;  задавать;  }}}  
5
ответ дан Itay Karo 15 August 2018 в 15:55
поделиться
  • 1
    Я не вижу в этом объяснения, почему явно реализация интерфейса должна быть более ограниченной, чем неявная реализация. Возможно, имеет смысл, если неявная реализация приводит к компилятору C #, автоматически генерирующему для вас необходимый явный код реализации. Могли бы вы устранить здесь логический разрыв - что именно делает явным неявное отличие от явного, которое нарушает код OP? – binki 28 January 2015 в 22:28
  • 2
    Предположим, вы могли бы определить такой частный сеттер в явной реализации. Как бы вы его использовали? 'this.setter = ...' будет делегировать неявный сеттер (потому что это тип MyClass) и '((IMyInterface) this) .setter' будет терпеть неудачу, потому что IMyInterface не имеет определителя. – Itay Karo 29 January 2015 в 05:48
  • 3
    В этом весь смысл. Если явно реализованное свойство может быть автоматически реализовано, тогда мне не придется вручную реализовывать для него собственное хранилище. Я мог бы также полагаться на интерфейс, определяющий только геттер, чтобы скрыть мой собственный сеттер. Ну, есть проблемы с этим, я думаю, но, на мой взгляд, это в основном та же проблема, что и неспособность переопределить только средство настройки или getter . Вы должны сообщить компилятору, что только ваш сеттер или только ваш получатель реализует явный интерфейс. – binki 29 January 2015 в 16:00
Другие вопросы по тегам:

Похожие вопросы: