Модификаторы доступа на элементах интерфейса в C#

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

"модификатор" public "недопустим для этого элемента"

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

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

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

2 ответов


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

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 это даже не возможно реализовать оба интерфейса этого примера в одном классе (поскольку свойства отличаются только типом возврата). В других случаях может потребоваться намеренно обеспечить различное поведение для отдельных представлений класса через различные интерфейсы.


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

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