Pregunta

Estoy recibiendo un error de compilación de la siguiente propiedad.
El error es:

  

"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 de tener / no tener el nombre de la interfaz en la firma?

¿Fue útil?

Solución

explícita implementación de la interfaz no le permite especificar los modificadores de acceso. Cuando se implementa un miembro de interfaz explícita (especificando el nombre de la interfaz antes de que el nombre de miembro), puede acceder a ese miembro sólo con esa interfaz . Básicamente, si lo hace:

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

No se puede hacer:

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

Hay varios casos de uso de EII. Por ejemplo, se desea proporcionar un método Close para su clase para liberar recursos adquiridos, pero aún quiere 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 puede llamar directamente Dispose (y ni siquiera se verá en la lista Test Intellisense) pero todavía se puede utilizar la clase using donde se espera un <=> ( por ejemplo, en un comunicado <=>).

Otro caso de uso para 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 (como las propiedades difieren solo en el tipo de devolución). En otros casos, es posible que desee proporcionar intencionadamente comportamiento diferente de puntos de vista individuales de una clase a través de diferentes interfaces.

Otros consejos

Todos los elementos de una interfaz deben ser públicas. Después de todo, una interfaz es de 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 su nivel de acceso, incluso para especificar de forma redundante que es pública.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top