Можно ли ссылаться на одноименное неявное свойство в явной реализации интерфейса?
-
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;
сработало бы. Это, конечно, потому что <=> не является интерфейсной переменной, и поэтому неявное свойство будет выбрано по умолчанию. Р>