Почему мне нужно привести "this" к типу интерфейса в явной реализации C#?
У меня есть интерфейс:
public interface Profile
{
string Name { get; }
string Alias { get; set; }
}
Все объекты, которые реализуют Profile
иметь Name
и Alias
, но некоторые ограничивают Alias
так, что это всегда так же, как Name
, Те, которые применяют это ограничение, могут реализовать Alias
как это:
string Profile.Alias
{
get
{
return ((Profile)this).Name;
}
set { }
}
поскольку this
в контексте явной реализации интерфейса может быть только тип Profile
и мы знаем, что к нему обращались через Profile
Интерфейс, а не интерфейс содержащего класса или любой другой интерфейс, который он реализует. Почему требуется приведение?
С помощью return this.Name;
для реализации геттера приводит к этой ошибке:
Type `ConcreteProfile' does not contain a definition for `Name' and no extension method `Name' of type `ConcreteProfile' could be found (are you missing a using directive or an assembly reference?)
2 ответа
поскольку
this
в контексте явной реализации интерфейса может быть только типProfile
Это неправда. Вы реализуете Profile.Alias
внутри ConcreteProfile
учебный класс. В данном контексте, this
относится к ConcreteProfile
экземпляр и может быть использован для доступа к любому члену ConcreteProfile
пример.
Например, ConcreteProfile
класс может содержать другой Name
свойство, которое не Profile.Name
, В этом случае this.Name
будет относиться к этому свойству.
Так как вы хотите получить доступ Profile.Name
, вы должны бросить this
в Profile
,
Так как это в контексте явной реализации интерфейса, возможно, может иметь только тип Profile, и мы знаем, что к нему обращались через интерфейс Profile, а не из содержащего класса или любого другого интерфейса, который он реализует, почему требуется приведение?
Потому что он использует явную реализацию интерфейса. Это просто часть того, что делает явная реализация интерфейса - и часть того, как она достигает своей цели устранения неоднозначности вызовов, которые в противном случае были бы неоднозначными. Из спецификации C# 5, раздел 13.4.1:
Невозможно получить доступ к явной реализации элемента интерфейса через его полное имя в вызове метода, доступе к свойству или доступу индексатора. Явная реализация члена интерфейса может быть доступна только через экземпляр интерфейса, и в этом случае на него ссылается просто его имя члена.
...
Явные реализации членов интерфейса служат двум основным целям:
- Поскольку явные реализации членов интерфейса не доступны через экземпляры класса или структуры, они позволяют исключить реализации интерфейса из открытого интерфейса класса или структуры. Это особенно полезно, когда класс или структура реализуют внутренний интерфейс, который не представляет интереса для потребителя этого класса или структуры.
- Явные реализации членов интерфейса позволяют устранять неоднозначность членов интерфейса с одинаковыми сигнатурами. Без явных реализаций членов интерфейса для класса или структуры было бы невозможно иметь разные реализации членов интерфейса с одинаковой сигнатурой и типом возврата, как было бы невозможно для класса или структуры иметь какую-либо реализацию на всех членах интерфейса с та же подпись, но с разными типами возврата.