Почему мне нужно привести "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:

Невозможно получить доступ к явной реализации элемента интерфейса через его полное имя в вызове метода, доступе к свойству или доступу индексатора. Явная реализация члена интерфейса может быть доступна только через экземпляр интерфейса, и в этом случае на него ссылается просто его имя члена.

...

Явные реализации членов интерфейса служат двум основным целям:

  • Поскольку явные реализации членов интерфейса не доступны через экземпляры класса или структуры, они позволяют исключить реализации интерфейса из открытого интерфейса класса или структуры. Это особенно полезно, когда класс или структура реализуют внутренний интерфейс, который не представляет интереса для потребителя этого класса или структуры.
  • Явные реализации членов интерфейса позволяют устранять неоднозначность членов интерфейса с одинаковыми сигнатурами. Без явных реализаций членов интерфейса для класса или структуры было бы невозможно иметь разные реализации членов интерфейса с одинаковой сигнатурой и типом возврата, как было бы невозможно для класса или структуры иметь какую-либо реализацию на всех членах интерфейса с та же подпись, но с разными типами возврата.
Другие вопросы по тегам