Pergunta

Estou recebendo um erro de compilação da seguinte propriedade.
O erro é:

"O modificador 'público' não é válido para este item"

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

mas se eu remover o IWorkItemControl ele compila bem.

Por que estou recebendo este erro e qual é a diferença de ter / não ter o nome da interface na assinatura?

Foi útil?

Solução

implementação explícita da interface não permite que você especificar quaisquer modificadores de acesso. Quando você implementa um membro de interface explícita (especificando o nome da interface antes do nome do membro), você pode acessar esse membro usando apenas essa interface . Basicamente, se você fizer isso:

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

Você não pode fazer:

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

Há vários casos de uso para EII. Por exemplo, você quer fornecer um método Close para sua classe para cima adquiriu recursos livres, mas você ainda deseja implementar IDisposable. Você poderia fazer:

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

Desta forma, os consumidores da classe só pode chamar Close diretamente (e eles não vão mesmo ver Dispose na lista Intellisense), mas você ainda pode usar a classe Test onde quer que um IDisposable é esperado (por exemplo, em um comunicado using).

Outro caso de uso para EII está fornecendo diferentes implementações de um membro de interface idêntica nomeado para duas interfaces:

interface IOne {
   bool Property { get; }
}

interface ITwo {
   string Property { get; }
}

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

Como você vê, sem EII-lo de nem mesmo possível para implementar ambas as interfaces deste exemplo em uma única classe (como as propriedades diferem apenas no tipo de retorno). Em outros casos, você pode querer fornecer intencionalmente um comportamento diferente para exibições individuais de uma classe através de interfaces diferentes.

Outras dicas

Todos os elementos de uma interface deve ser pública. Afinal, uma interface é a exibição pública de um objeto.

Desde Propriedades é um elemento de uma interface IWorkItemControl , já é público, e você não pode especificar o nível de acesso, até mesmo de forma redundante especificar que ele é público.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top