Подтвердить что ты не робот

Модификаторы доступа для членов интерфейса в С#

Я получаю ошибку компиляции из следующего свойства.
Ошибка:

"Модификатор" public "недействителен для этого элемента"

public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

но если я удаляю IWorkItemControl, он компилируется отлично.

Почему я получаю эту ошибку и в чем разница наличия/отсутствия имени интерфейса в сигнатуре?

4b9b3361

Ответ 1

Явная реализация интерфейса не позволяет вам указывать какие-либо модификаторы доступа. Когда вы явно реализуете член интерфейса (указав имя интерфейса перед именем члена), вы можете получить доступ к этому члену только с помощью этого интерфейса. В принципе, если вы это сделаете:

System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

Вы не можете:

MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface

Существует несколько вариантов использования EII. Например, вы хотите предоставить метод Close для вашего класса, чтобы освободить приобретенные ресурсы, но вы все же хотите реализовать IDisposable. Вы можете сделать:

class Test : IDisposable {
    public void Close() {
        // Frees up resources
    }
    void IDisposable.Dispose() {
        Close();
    }
}

Таким образом, потребители класса могут напрямую ссылаться на Close (и они даже не видят Dispose в списке Intellisense), но вы все равно можете использовать класс Test везде, где ожидается IDisposable ( например, в выражении using).

Другим вариантом использования для EII является предоставление различных реализаций идентично названного элемента интерфейса для двух интерфейсов:

interface IOne {
   bool Property { get; }
}

interface ITwo {
   string Property { get; }
}

class Test : IOne, ITwo {
   bool IOne.Property { ... }
   string ITwo.Property { ... }
}

Как вы видите, без EII не возможно реализовать оба интерфейса этого примера в одном классе (поскольку свойства различаются только в обратном типе). В других случаях вам может потребоваться преднамеренное предусмотреть другое поведение для отдельных представлений класса с помощью разных интерфейсов.

Ответ 2

Все элементы интерфейса должны быть общедоступными. В конце концов, интерфейс является общедоступным видом объекта.

Так как Свойства является элементом интерфейса IWorkItemControl, он уже является общедоступным, и вы не можете указать его уровень доступа, даже чтобы лишний раз указать, что он является общедоступным.