Можно ли ссылаться на одноименное неявное свойство в явной реализации интерфейса?

StackOverflow https://stackoverflow.com/questions/650898

  •  19-08-2019
  •  | 
  •  

Вопрос

Скажем, у меня есть тип, который реализует свойство с строковым типом:

public class Record
{
     public string Value { get; set; }
}

Тогда у меня есть интерфейс, который определяет свойство с тем же именем:

public interface IIntValued
{
     public int Value { get; set; }
}

Я могу использовать явный интерфейс следующим образом:

public class Record : IIntValued
{
     public string Value { get; set; }
     int IIntValued.Value 
     {
          get{ return 0; } set{}
     }
}

Однако, если я хочу иметь возможность ссылаться на строку " Value " в моем явном интерфейсе я могу это сделать? Если да, то как? Я полагаю, что-то вроде:

public class Record : IIntValued
{
     public string Value { get; set; }
     public int IIntValued.Value 
     {
          get
          {
               string value = /*Magic here*/.Value;
               return int.parse(value); 
          } 
          set{}
     }
}

Как видите, я хочу " string valueed " & Quot; Значение Quot &; свойство для выражения в " int valueed " & Quot; Значение Quot &; имущество. Если бы это был другой явно реализованный элемент интерфейса, я мог бы привести его к типу интерфейса и затем использовать, но как бы он работал для неявного члена типа?

Примечание. Пример немного надуман, но, надеюсь, демонстрирует языковой вопрос.

Это было полезно?

Решение

Для неявного члена типа достаточно использовать Value или this.Value, поскольку по умолчанию он не разрешается в IIntValued.Value.

Другие советы

Конечно, вы можете! Проблема в том, что вы размещали ключевые слова доступности там, где они запрещены. Явно реализованные члены не могут иметь ключевое слово accessibility. Неявно реализованный будет записан без IIntValue. префикс к имени участника.

Вот пример, который работает.

public interface IIntValued
{
  int Value { get; set; }
}

public class Record : IIntValued
{
  public string Value { get; set; }
  int IIntValued.Value
  {
    get
    {
      string value = this.Value;
      return int.Parse(value);
    }
    set { }
  }
}

Да, вы можете получить доступ к обоим свойствам. Это зависит от типа переменной, используемой для доступа к свойству. Обратите внимание:

Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;

string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;

Тьфу, написав резюме, я понял, что знаю ответ. :П Если я возьму this и приведу его к типу класса, реализация explict не будет включена:

string value = ((Record)this).Value; //is the implicit string.

Edit: . После некоторого дополнительного ввода (спасибо респондентам!) было отмечено, что нет необходимости вручную делать то, что компилятор делает автоматически. Таким образом:

string value = this.Value;

сработало бы. Это, конечно, потому что <=> не является интерфейсной переменной, и поэтому неявное свойство будет выбрано по умолчанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top