2010-10-11 11 views
11

¿Hay alguna manera de implementar una interfaz de forma explícita el uso de una propiedad automática? Por ejemplo, considere este código:aplicación explícita de una interfaz usando una propiedad automática

namespace AutoProperties 
{ 
    interface IMyInterface 
    { 
     bool MyBoolOnlyGet { get; } 
    } 

    class MyClass : IMyInterface 
    { 
     static void Main(){} 

     public bool MyBoolOnlyGet { get; private set; } // line 1 
     //bool IMyInterface.MyBoolOnlyGet { get; private set; } // line 2 
    } 
} 

Este código se compila. Sin embargo, si reemplaza la línea 1 con la línea 2, no compila.

(No es que necesito para obtener la línea 2 de trabajo - Sólo por curiosidad.)

+0

Qué error Qué se obtiene? –

+2

Para "por qué" - pregúntese ... ¿cómo lo asignaría? –

+0

Recibo dos errores: 1. 'AutoProperties.MyClass.AutoProperties.IMyInterface.MyBoolOnlyGet.set' agrega un acceso no encontrado en el miembro de la interfaz 'AutoProperties.IMyInterface.MyBoolOnlyGet'. 2. El modificador 'privado' no es válido para este artículo – user181813

Respuesta

13

De hecho, esa disposición especial (implementación explícita de una propiedad de interfaz para hacerse solamente por una propiedad implementado de forma automática) ISN' t compatible con el idioma. Así que ya sea hacerlo de forma manual (con un campo), o escribir un puntal de auto-aplicado privado y proxy de la misma. Pero para ser honesto, en el momento en que lo haya hecho que también podría haber utilizado un campo ...

private bool MyBool { get;set;} 
bool IMyInterface.MyBoolOnlyGet { get {return MyBool;} } 

o:

private bool myBool; 
bool IMyInterface.MyBoolOnlyGet { get {return myBool;} } 
5

El problema es que la interfaz sólo tiene getter y intenta implementarlo explícitamente con getter y setter.
Cuando se implementa una interfaz de forma explícita la aplicación explícita se llamará sólo cuando su referencia, si es de la interfaz, así que ... si la interfaz sólo ha getter no hay manera de utilizar la incubadora por lo que no tiene sentido tener una setter allí.

Esto, por ejemplo compilará:

namespace AutoProperties 
    { 
     interface IMyInterface 
     { 
      bool MyBoolOnlyGet { get; set; } 
     } 

     class MyClass : IMyInterface 
     { 
      static void Main() { } 

      bool IMyInterface.MyBoolOnlyGet { get; set; } 
     } 
    } 
+0

No veo esto explica por qué explícitamente la implementación de la interfaz debe ser más restringida que la aplicación implícita. Tal vez tenga sentido si la implementación implícita da como resultado que el compilador de C# genere automáticamente el código de implementación explícito necesario para usted. ¿Podrían cerrar la brecha lógica aquí? ¿Qué hace exactamente implícito diferente de explícito que rompe el código del OP? – binki

+0

Suponga que podría haber definido dicho sistema privado en una implementación explícita. Cómo lo usarías? 'This.setter = ...' delegará en la incubadora implícita (ya que este es de tipo MiClase) y '((IMyInterface) esto) .setter' fallará porque IMyInterface no tiene definido el colocador. –

+0

Ese es todo el punto. Si la propiedad explícitamente implementada se pudiera implementar automáticamente, entonces no tendría que implementar manualmente mi propio almacén de respaldo. También podría confiar en que la interfaz solo define un getter para ocultar mi setter privado. Bueno, hay problemas con eso, supongo, pero en mi mente que es básicamente el mismo problema como [incapaz de anular simplemente incubadora o comprador de una propiedad] (http://stackoverflow.com/a/6058526/429091). Debería poder decirle al compilador que solo su setter o solo su getter está implementando la interfaz explícita. – binki

Cuestiones relacionadas