Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puede encontrar los siguientes errores relacionados con las declaraciones de propiedad:
- CS0200: No se puede asignar la propiedad o el indexador 'property', es de solo lectura.
- CS0545: 'function': no se puede sobrescribir porque 'property' no tiene un descriptor de acceso get sobrescribible
- CS0571: 'function': no se puede llamar explícitamente al operador o accesor
- CS0840: 'Nombre de propiedad' debe declarar un cuerpo porque no está marcado como abstracto o extern. Las propiedades implementadas automáticamente deben definir descriptores de acceso get y set.
- CS1014: se esperaba un accesor get o set
- CS1043: { o ; esperado
- CS8050: solo las propiedades implementadas automáticamente o las propiedades que usan la palabra clave "field", pueden tener inicializadores.
- CS8051: Las propiedades implementadas automáticamente deben tener accesores 'get'
- CS8053: Las propiedades de instancia de las interfaces no pueden tener inicializadores
- CS8145: Las propiedades implementadas automáticamente no pueden devolverse por referencia
- CS8147: Las propiedades que devuelven por referencia no pueden tener descriptores de acceso establecidos
- CS8341: Las propiedades de instancia implementadas automáticamente en estructuras de solo lectura deben ser de solo lectura
- CS8657: El miembro estático no se puede marcar como "readonly".
- CS8658: El accesor "set" implementado automáticamente no se puede marcar como "readonly".
- CS8659: La propiedad implementada automáticamente no se puede marcar como "readonly" porque tiene un descriptor de acceso "set".
- CS8660: No se pueden especificar modificadores "readonly" en la propiedad y en su descriptor de acceso
- CS8661: No se pueden especificar modificadores "readonly" en ambos accesores de una propiedad
- CS8664: "readonly" solo se puede usar en descriptores de acceso si la propiedad tiene get y set
- CS9029: Los tipos y alias no se pueden denominar "required".
- CS9030: el miembro debe ser necesario porque invalida el miembro necesario.
- CS9031: el miembro derivado no puede ocultar el miembro requerido.
- CS9032: el miembro requerido no puede ser menos visible o tener un establecedor menos visible que el tipo contenedor.
-
CS9033: No usar '
System.Runtime.CompilerServices.RequiredMemberAttribute'. Use la palabra clave "required" en los campos y propiedades necesarios en su lugar. - CS9034: el miembro requerido debe poder establecerse.
- CS9035: el miembro requerido debe establecerse en el inicializador de objeto o el constructor de atributos.
- CS9036: al miembro requerido "memberName" se le debe asignar un valor, no puede usar un miembro anidado ni un inicializador de colección.
- CS9037: la lista de miembros necesaria tiene un formato incorrecto y no se puede interpretar.
-
CS9038: la lista de miembros necesaria para el tipo base tiene un formato incorrecto y no se puede interpretar. Para usar este constructor, aplique el atributo '
SetsRequiredMembers'. -
CS9039: este constructor debe agregar "
SetsRequiredMembers" porque se encadena a un constructor que tiene ese atributo. -
CS9040: El tipo no puede satisfacer la restricción "
new()" del parámetro en el tipo genérico o método porque tiene miembros necesarios. -
CS9042: El miembro requerido no debe atribuirse con '
ObsoleteAttribute' a menos que el tipo contenedor esté obsoleto o todos los constructores estén obsoletos. - CS9045: no se permiten los miembros necesarios en el nivel superior de un script o envío.
-
CS9258: en esta versión del lenguaje, la palabra clave "
field" se enlaza a un campo de respaldo sintetizado para la propiedad . Para evitar generar un campo de respaldo sintetizado y hacer referencia al miembro existente, use "this.field" o "@field" en su lugar. - CS9263: Una propiedad parcial no puede tener un inicializador tanto en la definición como en la implementación.
Se pueden generar las siguientes advertencias para las propiedades respaldadas por campos:
-
CS9264: la propiedad no nullable debe contener un valor distinto de NULL al salir del constructor. Considere agregar el modificador "required", declarar la propiedad como nullable, o agregar de atributos "
[field: MaybeNull, AllowNull]". -
CS9266: un descriptor de acceso de la propiedad debe usar '
field' porque el otro descriptor de acceso lo está usando. -
CS9273: en esta versión del lenguaje, '
field' es una palabra clave dentro de un descriptor de acceso de propiedad. Cambie el nombre de la variable o use el identificador '@field' en su lugar.
En las secciones siguientes se explica la causa y las soluciones de estos errores y advertencias.
Sintaxis de descriptor de acceso de propiedad
- CS0545: 'function': no se puede sobrescribir porque 'property' no tiene un accesor get sobrescribible
- CS0571: 'function': no se puede llamar explícitamente al operador o accesor
- CS1043: { o ; esperado
Para corregir errores de sintaxis de accesor de propiedad, aplique uno de los siguientes cambios según el diagnóstico específico:
Invalide solo los descriptores de acceso que existen en la declaración de propiedad de clase base (CS0545). No se puede sobrescribir un descriptor de acceso de propiedad que no esté presente ni accesible en la clase base porque no hay ningún método virtual que sobrescribir en el IL ya compilado. Si la propiedad de la clase base solo tiene un get descriptor de acceso, quite el descriptor de acceso de la set invalidación o agregue el descriptor de acceso que falta a la clase base y márquelo como virtual. Como alternativa, use la palabra clave new en lugar de override para ocultar la propiedad de la clase base con una definición de propiedad completamente nueva que tiene descriptores de acceso diferentes.
Acceder a las propiedades mediante la sintaxis de propiedad en lugar de llamar a métodos de acceso directamente (CS0571). Los accesores de propiedad se compilan en métodos especiales con nombres como get_PropertyName y set_PropertyName, pero debe invocar estos métodos a través de la sintaxis de propiedad (obj.Property y obj.Property = value). Este enfoque mantiene la semántica adecuada y permite al compilador realizar comprobaciones necesarias. El mismo principio se aplica a los operadores, que se compilan en métodos como op_Increment , pero se deben invocar mediante la sintaxis de operador (++obj) en lugar de llamadas a métodos.
Use la sintaxis adecuada de accesores de propiedad con llaves o cuerpos de expresión (CS1043). Los descriptores de acceso de propiedad deben seguir las reglas de sintaxis de C#: los cuerpos de descriptor de acceso deben incluirse entre llaves { }, los descriptores de acceso con forma de expresión deben usar la => sintaxis y las propiedades implementadas automáticamente deben terminar con un punto y coma después de la lista de descriptores de acceso. El compilador espera una implementación completa del descriptor de acceso o el punto y coma que indica un descriptor de acceso implementado automáticamente.
Para obtener más información, vea Propiedades, Herencia y Uso de propiedades.
Propiedades implementadas automáticamente
- CS0840: 'Nombre de propiedad' debe declarar un cuerpo porque no está marcado como abstracto o extern. Las propiedades implementadas automáticamente deben definir descriptores de acceso get y set.
- CS1014: Se esperaba un accesor get o set
Para corregir los errores de propiedad implementados automáticamente, aplique uno de los siguientes cambios en función del diagnóstico específico:
Agregue ambos accesores get y set a la declaración de propiedad (CS0840). Las propiedades implementadas automáticamente requieren que el compilador genere un campo de respaldo y el compilador solo puede hacerlo cuando ambos descriptores de acceso están presentes para asegurarse de que el almacenamiento puede leerse y escribirse. Si necesita una propiedad de solo lectura implementada automáticamente, incluya un set accesor y ajústelo private para restringir el acceso de escritura mientras permite al compilador generar el campo subyacente. Alternativamente, si la propiedad se declara como abstract o extern, elimine por completo los cuerpos de los accesores, ya que estos modificadores indican que la implementación se proporciona en otro lugar. Para propiedades partial, puede dividir la declaración y la implementación en declaraciones de tipo parcial.
Asegúrese de que la declaración de propiedad contiene solo palabras clave de accesor válidas get y set (CS1014). La sintaxis de propiedad solo permite declaraciones de métodos de acceso, no instrucciones arbitrarias ni declaraciones de miembros dentro del cuerpo de la propiedad. Si necesita lógica adicional, implemente la propiedad con cuerpos de accesores explícitos que contengan su código. Si está intentando declarar campos o métodos, mueva esas declaraciones fuera de la propiedad al cuerpo de clase o estructura donde se permiten declaraciones de miembro.
Para obtener más información, vea Propiedades y propiedades implementadas automáticamente.
Propiedades respaldadas por campos
-
CS9258: en esta versión del lenguaje, la palabra clave "
field" se enlaza a un campo de respaldo sintetizado para la propiedad . Para evitar generar un campo de respaldo sintetizado y hacer referencia al miembro existente, use "this.field" o "@field" en su lugar. - CS9263: Una propiedad parcial no puede tener un inicializador tanto en la definición como en la implementación.
-
CS9264: La propiedad no anulable debe contener un valor distinto de NULL al salir del constructor. Considere agregar el modificador "required", declarar la propiedad como anulable o añadir atributos "
[field: MaybeNull, AllowNull]". -
CS9266: un descriptor de acceso de la propiedad debe usar '
field' porque el otro descriptor de acceso lo está usando. -
CS9273: en esta versión del lenguaje, '
field' es una palabra clave dentro de un descriptor de acceso de propiedad. Cambie el nombre de la variable o use el identificador '@field' en su lugar.
Para corregir los errores de propiedad respaldados por campos, aplique uno de los siguientes cambios en función del diagnóstico específico:
Cambie el nombre de cualquier variable denominada field a un identificador diferente o use la sintaxis de @field escape para hacer referencia a la variable (CS9258, CS9273). Esta corrección es necesaria porque field es una palabra clave contextual dentro de los descriptores de acceso de propiedad en C# 13 y versiones posteriores, donde hace referencia al campo de respaldo sintetizado por el compilador. Si desea acceder a un miembro existente denominado field en lugar del campo de respaldo sintetizado, puede calificarlo con this.field para desambiguar la referencia.
Quite el inicializador de la definición de propiedad parcial o de la implementación, manteniendo solo uno (CS9263). Esta corrección es necesaria porque permitir inicializadores en ambas ubicaciones crearía ambigüedad sobre qué valor se debe usar y podría provocar que el campo de respaldo se inicialice dos veces con valores potencialmente diferentes.
Agregue el [field: MaybeNull, AllowNull] atributo a la declaración de propiedad para indicar que el campo auxiliar se debe considerar como nullable (CS9264). Esta corrección alinea las expectativas de nulabilidad entre el tipo de propiedad y el campo de respaldo generado por el compilador, resolviendo el desajuste donde la propiedad se declara como no anulable, pero el uso de la palabra clave field sugiere que podría ser NULL. Como alternativa, cambie el tipo de propiedad a anulable, agregue el modificador required para garantizar la inicialización o inicialice la propiedad en el constructor.
Use constantemente la field palabra clave en ambos descriptores de acceso o use un campo de respaldo explícito en ambos descriptores de acceso (CS9266). Esta corrección evita posibles errores en los que un descriptor de acceso modifica el campo de respaldo sintetizado por el compilador, mientras que el otro descriptor de acceso modifica una ubicación de almacenamiento diferente, lo que conduce a un comportamiento de propiedad incoherente.
Para obtener más información, vea palabra clave 'field' y propiedades parciales.
Propiedades de solo lectura
- CS0200: No se puede asignar la propiedad o el indexador 'property', es de solo lectura.
- CS8341: Las propiedades de instancia implementadas automáticamente en estructuras de solo lectura deben ser de solo lectura
- CS8657: El miembro estático no se puede marcar como "readonly".
- CS8658: El descriptor de acceso "set" implementado automáticamente no se puede marcar como "readonly".
- CS8659: La propiedad implementada automáticamente no se puede marcar como "readonly" porque tiene un descriptor de acceso "set".
- CS8660: No se pueden especificar modificadores "readonly" en la propiedad y en su descriptor de acceso
- CS8661: No se pueden especificar modificadores "readonly" en ambos descriptores de acceso de propiedad
- CS8664: "readonly" solo se puede usar en descriptores de acceso si la propiedad tiene get y set
Para corregir errores de propiedades de solo lectura, aplique uno de los siguientes cambios según el diagnóstico específico:
Agregue un set o init descriptor de acceso a la propiedad para que se pueda escribir (CS0200). Esta corrección es necesaria porque las propiedades sin accesores 'set' son de solo lectura y solo se pueden asignar en el constructor o inicializador de campo del tipo que lo declara. Si necesita establecer la propiedad durante la inicialización del objeto pero inmutable después, use un init descriptor de acceso en lugar de un set descriptor de acceso. Si la propiedad debe permanecer de solo lectura, traslade la asignación al constructor, donde es posible inicializar, o reconsidere si la asignación es realmente necesaria.
Marque las propiedades de instancia implementadas automáticamente como readonly cuando las declare dentro de (readonly structCS8341). Esta corrección refuerza el contrato de inmutabilidad de la estructura contenedora, asegurando que todos los miembros de instancia respeten la garantía readonly. Si la propiedad debe ser mutable, quite el readonly modificador de la declaración de estructura o implemente la propiedad con un campo de respaldo explícito y cuerpos de accesor que no modifiquen el estado de la instancia.
Quite el modificador readonly de las declaraciones de propiedad estática o accesor (CS8657). Esta corrección es necesaria porque el readonly modificador solo se aplica a los miembros de instancia de estructuras para indicar que no modifican el estado de la instancia y los miembros estáticos no tienen estado de instancia para proteger. Si necesita una propiedad estática de solo lectura, simplemente omita el set accesor en lugar de usar el readonly modificador.
Quite el readonly modificador de los accesores autoimplementados set o aplíquelo solo al get accesor (CS8658). Esta corrección es necesaria porque set los descriptores de acceso modifican inherentemente el estado, lo que contrasta con el propósito del readonly modificador que garantiza ninguna modificación del estado de la instancia. Si necesita una propiedad que se pueda establecer durante la inicialización, pero que sea de solo lectura después, use un init accesor en lugar de un set accesor.
Quite el readonly modificador de la declaración de propiedad cuando la propiedad tenga un set accesorio (CS8659). Esta corrección es necesaria porque las propiedades con set descriptores de acceso pueden modificar el estado de la instancia, lo que infringe la readonly garantía. Si solo necesita una configuración en tiempo de inicialización, reemplace el set accesor por un init accesor o quite el set accesor completamente para que la propiedad sea de solo lectura.
Coloque el readonly modificador en la declaración de propiedad o en descriptores de acceso individuales, pero no en ambos (CS8660, CS8661). Esta corrección evita declaraciones de modificadores redundantes que podrían crear confusión sobre qué modificador tiene prioridad. Si desea marcar descriptores de acceso específicos como readonly, quite el modificador de la declaración de propiedad y colóquelo solo en los descriptores de acceso. Como alternativa, si todos los descriptores de acceso deben ser readonly, marque la propia propiedad en lugar de descriptores de acceso individuales.
Asegúrese de que ambos get y set descriptores de acceso estén presentes al marcar descriptores de acceso individuales como readonly (CS8664). Esta corrección es necesaria porque el readonly modificador en descriptores de acceso individuales distingue entre los descriptores de acceso que modifican el estado y los que no, lo que solo tiene sentido cuando existen ambos tipos de descriptor de acceso. Si la propiedad solo tiene un get descriptor de acceso, marque toda la propiedad como readonly en lugar del descriptor de acceso individual.
Para obtener más información, vea readonly instance members, init keyword y Properties.
Inicializadores de propiedades
- CS8050: solo las propiedades implementadas automáticamente o las propiedades que usan la palabra clave "field", pueden tener inicializadores.
- CS8051: Las propiedades implementadas automáticamente deben tener accesores get
- CS8053: Las propiedades de instancia de las interfaces no pueden tener inicializadores
Para corregir los errores del inicializador de propiedades, aplique uno de los siguientes cambios en función del diagnóstico específico:
Convierta la propiedad para usar la sintaxis autoimplementada quitando los cuerpos de los accesores y permitiendo que el compilador genere el campo secundario (CS8050). Esta corrección es necesaria porque solo las propiedades con almacenamiento administrado por el compilador pueden tener inicializadores, lo que garantiza que la inicialización se produce antes de que se ejecute cualquier lógica de descriptor de acceso. Como alternativa, modifique las implementaciones de accesorios para usar la palabra clave field para acceder al campo de respaldo sintetizado por el compilador. Este enfoque habilita el inicializador y mantiene la lógica personalizada del descriptor de acceso. Si ninguno de los enfoques es adecuado, quite el inicializador y asigne el valor en un constructor en su lugar, donde tiene control total sobre la secuencia de inicialización.
Agregue un get descriptor de acceso a la propiedad implementada automáticamente para habilitar la lectura del valor inicializado (CS8051). Esta corrección es necesaria porque los inicializadores establecen un valor que debe ser recuperable por lectura, y una propiedad de solo escritura infringe esta expectativa fundamental de la inicialización de propiedades. Si realmente necesita una propiedad de solo escritura, implemente los accesores explícitamente con un campo de respaldo y asigne el campo directamente en un constructor, en lugar de usar un inicializador de propiedad.
Quite el inicializador de las declaraciones de propiedad de interfaz (CS8053). Esta corrección es necesaria porque las interfaces definen contratos para implementar tipos en lugar de proporcionar implementaciones concretas con valores iniciales. Si necesita proporcionar valores predeterminados, implemente la propiedad en una clase que implemente la interfaz o use métodos de interfaz predeterminados (disponibles en C# 8.0 y versiones posteriores) para proporcionar una implementación predeterminada.
Para obtener más información, vea Propiedades, Propiedades implementadas automáticamente y palabra clave field.
Miembros requeridos
- CS9029: Los tipos y alias no se pueden denominar "required".
- CS9030: el miembro debe ser necesario porque invalida el miembro necesario.
- CS9031: el miembro derivado no puede ocultar el miembro requerido.
- CS9032: El miembro requerido no puede ser menos visible o tener un setter menos visible que el tipo que lo contiene.
-
CS9033: No usar '
System.Runtime.CompilerServices.RequiredMemberAttribute'. Use la palabra clave "required" en los campos y propiedades necesarios en su lugar. - CS9034: el miembro requerido debe ser configurable.
- CS9035: el miembro requerido debe establecerse en el inicializador de objeto o el constructor de atributos.
- CS9036: al miembro requerido "memberName" se le debe asignar un valor, no puede usar un miembro anidado ni un inicializador de colección.
- CS9037: la lista de miembros necesaria tiene un formato incorrecto y no se puede interpretar.
-
CS9038: la lista de miembros necesaria para el tipo base tiene un formato incorrecto y no se puede interpretar. Para usar este constructor, aplique el atributo '
SetsRequiredMembers'. -
CS9039: este constructor debe agregar "
SetsRequiredMembers" porque se encadena a un constructor que tiene ese atributo. -
CS9040: El tipo no puede satisfacer la restricción "
new()" del parámetro en el tipo genérico o método porque tiene miembros necesarios. -
CS9042: El miembro requerido no debe atribuirse utilizando '
ObsoleteAttribute' a menos que el tipo que lo contiene esté obsoleto o todos los constructores estén obsoletos. - CS9045: Los miembros requeridos no están permitidos en el nivel superior de un script o entrega.
Para corregir los errores de miembros requeridos, aplique uno de los siguientes cambios en función del diagnóstico específico:
Evite usar required como nombre de tipo o alias (CS9029). Esta corrección es necesaria porque required es una palabra clave contextual en C# 11 y versiones posteriores, y su uso como nombre de tipo crea ambigüedad en el código donde puede aparecer la palabra clave.
Asegúrese de que los miembros derivados mantengan el required modificador al sobrescribir los miembros necesarios (CS9030). Esta corrección aplica el contrato establecido por la clase base, garantizando que todos los tipos derivados mantengan los mismos requisitos de inicialización. Evite ocultar los miembros necesarios con miembros no necesarios en clases derivadas (CS9031), ya que esta acción interrumpe el contrato de inicialización que los consumidores esperan del tipo base.
Haga que los miembros necesarios sean al menos tan visibles como su tipo contenedor y asegúrese de que los establecedores de propiedades también sean lo suficientemente visibles (CS9032). Esta corrección impide situaciones en las que un tipo es accesible públicamente, pero sus miembros necesarios no se pueden inicializar desde todos los contextos en los que se construye el tipo.
Use la required palabra clave en lugar de aplicar RequiredMemberAttribute manualmente (CS9033). Esta corrección garantiza que el compilador genere los metadatos correctos y aplique todas las reglas de miembro necesarias, que la aplicación de atributo manual podría no hacer correctamente.
Asegúrese de que los miembros requeridos tienen descriptores de acceso establecidos o que puedan configurarse (CS9034). Esta corrección es necesaria porque los miembros necesarios deben inicializarse durante la creación de objetos, lo que requiere acceso de escritura. Al crear instancias, inicialice los miembros necesarios directamente en inicializadores de objeto (CS9035, CS9036). Debe asignar un valor a cada miembro requerido en lugar de usar inicializadores de miembros anidados o inicializadores de colección, debido a que el propio miembro requerido debe establecerse antes de acceder a sus propiedades.
Aplique el SetsRequiredMembers atributo a constructores que inicialicen todos los miembros necesarios en sus cuerpos (CS9038, CS9039). Esta corrección informa al compilador de que el constructor cumple el contrato de miembro necesario, lo que permite la creación de objetos sin inicializadores de objeto. Si un constructor se encadena a otro constructor con SetsRequiredMembers, también debe tener el atributo .
Evite usar miembros necesarios en tipos que deben satisfacer la new() restricción (CS9040), ya que el constructor sin parámetros no puede garantizar la inicialización de miembros necesaria sin inicializador de objeto. No marque los miembros requeridos como obsoletos a menos que el tipo contenedor o todos los constructores estén obsoletos (CS9042), para evitar situaciones en las que se requieren miembros, pero se desaconseja su uso. No se permiten miembros necesarios en instrucciones de nivel superior ni contextos de script (CS9045) porque estos contextos no admiten la sintaxis de inicialización de objetos necesaria para establecer los miembros necesarios.
Para obtener más información, consulte el artículo de referencia del modificador necesario y la guía Inicializadores de objetos y colecciones .
Propiedades devueltas
- CS8145: Las propiedades implementadas automáticamente no pueden devolverse por referencia
- CS8147: Las propiedades que devuelven por referencia no pueden tener descriptores de acceso establecidos
Para corregir los errores de propiedades que retornan referencias, aplique uno de los siguientes cambios según el diagnóstico específico:
Implemente la propiedad explícitamente con un campo de respaldo y use la ref palabra clave en la get expresión de retorno del descriptor de acceso (CS8145). Esta corrección es necesaria porque las propiedades implementadas automáticamente generan un campo de respaldo privado que el compilador administra internamente. Devolver una referencia a un campo privado expondría el almacenamiento interno al que los llamantes no deberían acceder directamente. Para crear una propiedad de devolución de referencia, declare un campo explícito y devuelvalo con => ref backingField sintaxis. Como alternativa, si no es necesario devolver una referencia que permita la modificación directa del almacenamiento, elimine el modificador ref de la declaración de propiedad.
Elimine el set accesor de las propiedades que devuelven una referencia (CS8147). Esta corrección es necesaria porque una propiedad que devuelve referencia ya proporciona acceso tanto de lectura como de escritura a través de la referencia devuelta. Los llamadores pueden modificar directamente el valor a través de la referencia sin necesidad de un método setter independiente. Incluir un set descriptor de acceso crearía dos mecanismos diferentes para modificar el mismo almacenamiento, que es redundante y podría provocar confusión sobre qué ruta de acceso de modificación se debe usar.
Para obtener más información, vea ref returns and ref locals and Properties.