2009-07-03 11 views
16

Recibo un error de compilación de la siguiente propiedad.
El error es:Modificadores de acceso en miembros de la interfaz en C#

"El modificador 'público' no es válido para este elemento"

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

pero si quito el IWorkItemControl que compila bien.

¿Por qué recibo este error y cuál es la diferencia entre tener/no tener el nombre de la interfaz en la firma?

Respuesta

41

Explicit interface implementation no le permite especificar ningún modificador de acceso. Cuando implementa explícitamente un miembro de interfaz (especificando el nombre de la interfaz antes del nombre del miembro), puede acceder a ese miembro solo con esa interfaz. Básicamente, si lo hace:

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

Puede no:

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

Existen varios casos de uso de EII. Por ejemplo, desea proporcionar un método Close para que su clase libere los recursos adquiridos pero aún desea implementar IDisposable. Se podría hacer:

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

De esta manera, los consumidores de clase sólo pueden llamar directamente Close (y ni siquiera verán Dispose en la lista de Intellisense) pero todavía se puede utilizar la clase Test donde se espera una IDisposable (por ejemplo, en una declaración using).

Otro caso de uso para la EII está proporcionando diferentes implementaciones de un miembro de interfaz con el mismo nombre para dos interfaces:

interface IOne { 
    bool Property { get; } 
} 

interface ITwo { 
    string Property { get; } 
} 

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

Como se ve, sin EII Es ni siquiera es posible para implementar ambas interfaces de este ejemplo en una sola clase (ya que las propiedades difieren solo en el tipo de devolución). En otros casos, es posible que desee proporcionar intencionalmente un comportamiento diferente para vistas individuales de una clase a través de diferentes interfaces.

0

Todos los elementos de una interfaz deben ser públicos. Después de todo, una interfaz es la vista pública de un objeto.

Desde Propiedades es un elemento de una interfaz IWorkItemControl, que ya es pública, y no se puede especificar el nivel de acceso, incluso para especificar de forma redundante que es pública.

+1

Esto no es una razón muy fuerte ya que todavía tiene que especificar manualmente el público para todos los miembros implementados implícitamente. Si ese fuera el caso, el compilador podría asumir automáticamente esos también como públicos. –

+0

Esto es incorrecto, ya que puede tener interfaces internas. –

Cuestiones relacionadas