2010-04-08 5 views
27

Cuando definimos una propiedad comoqué propiedades implementadas automáticamente deben definir tanto acceso get y set

public string Name {get; set;} 

punto net puede hacer que nuestro código propiedades. pero cuando usamos

public string Name {get;} 
    public string Name {set;} 

nos enfrentamos con

'Hajloo.SomeThing.PropertyName.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors. 

realidad por qué el compilador no puede determinar la propiedad y hacer que el código de forma automática? ¿Cuál es el problema?

+3

Esto ahora es compatible. http://kumarvikram.com/auto-property-enhancements-in-c-6/ – Onosa

Respuesta

55

Porque las propiedades implementadas automáticamente generan su propio almacén de respaldo para los valores de las propiedades. No tienes acceso a la tienda interna.

La implementación de una propiedad con

  • acaba de obtener: significa que sólo puede recuperar los valores. No se puede establecer el valor de la propiedad (incluso en la clase contenedora)
  • simplemente ajustado: significa que solo puede establecer los valores. No puedes recuperar el valor de la propiedad.

una propiedad normal de

private int _data; 
public int Data{ get { return _data } }; 

Aquí la clase padre puede hacer lo siguiente en otro lugar en la clase (que no puede con los apoyos de automóviles)

_data = 100;

Nota : Puede definir un autopropósito como este (que es como lo uso más).

public int Data { get; private set;} 

Esto significa que los clientes externos de la clase no pueden establecer la propiedad. Sin embargo, la clase contenedora puede establecer la propiedad varias veces a través de this.Data = x; dentro de la definición de la clase.

+2

También podría valer la pena mencionar el "conjunto privado" como una solución intermedia (y puede ser lo que el OP realmente está buscando " –

+0

@Damien: Eso también me estaba devorando ... la pereza se corrigió. – Gishu

5

Si no hay incubadora, la propiedad nunca puede tener nada más que el valor predeterminado, por lo que no sirve para nada.

+1

Puede hacer que la propiedad devuelva una colección. Al eliminar el colocador, no podrá cambiar el tipo de elemento, pero podría agregar elementos a la colección. – Gorgsenegger

+1

@Gorgsenegger - pero el punto es que si no hay un setter, la propiedad siempre tendrá su valor predeterminado - null en el caso de un tipo de referencia como una colección. En esta situación, no hay una colección a la que se puedan agregar elementos. – Joe

+0

Sí, eso es cierto. Me dejé llevar, pensando en una propiedad con un setter privado que luego podría establecerse, por ejemplo.dentro del constructor, pero tienes razón, sin ningún setter en lo absoluto no parece tener mucho sentido :-) – Gorgsenegger

0

Un escenario más moderno para recibir este error es intentar crear un proyecto que el autor original estaba compilando con VS2015 + y está utilizando una versión anterior.

VS 2015 usa un MSBuild que interpreta C# 6.0. En C# 6.0 es permisible tener propiedades auto que no tengan un setter (se supone que son un conjunto privado).

Intente compilar con VS2015 + o msbuild 14+

Cuestiones relacionadas