Compartir a través de


Errores y advertencias relacionados con declaraciones de tipos partial y miembros partial

Hay numerosos errores relacionados con declaraciones de tipos partial y miembros partial:

  • CS0260: Falta el modificador parcial en la declaración de tipo; ya existe otra declaración parcial de este tipo
  • CS0261: Las declaraciones parciales de tipo deben ser todas las clases, todas las estructuras o todas las interfaces
  • CS0262: Las declaraciones parciales de tipo tienen modificadores de accesibilidad conflictivos
  • CS0263: Las declaraciones parciales de tipo no deben especificar clases base diferentes
  • CS0264: Las declaraciones parciales de tipo deben tener los mismos nombres de parámetros de tipo en el mismo orden
  • CS0265: Las declaraciones parciales de tipo tienen restricciones incoherentes para el parámetro de tipo "type parameter"
  • CS0267: El modificador "partial" solo puede aparecer inmediatamente antes de "class", "record", "struct", "interface", o de un tipo de devolución de propiedad o método.
  • CS0282: No hay ninguna ordenación definida entre campos en varias declaraciones de class parcial o struct "type". Para indicar una ordenación, todos los campos de instancia deben estar en la misma declaración
  • CS0501: "member function" debe declarar un cuerpo porque no se marcó como abstract, extern o partial
  • CS0750: Un miembro parcial no puede tener el modificador "abstract"
  • CS0751: Un miembro parcial debe declararse en un class parcial o un struct parcial
  • CS0754: Un miembro parcial no puede implementar explícitamente un método de interfaz
  • CS0755: Ambas declaraciones de método parcial deben ser métodos de extensión; de lo contrario, no puede serlo ninguna de las dos
  • CS0756: Un método parcial no puede tener varias declaraciones de definición
  • CS0757: Un método parcial no puede tener varias declaraciones de implementación
  • CS0759: No se encuentra ninguna declaración de definición para la declaración de implementación del método parcial
  • CS0761: Las declaraciones de método parcial de method<T> tienen restricciones incoherentes de parámetros de tipo
  • CS0762: No se puede crear un delegado a partir del método porque es un método parcial sin una declaración de implementación
  • CS0763: Ambas declaraciones de método parcial deben ser static o ninguna de ellas puede ser static.
  • CS0764: Ambas declaraciones de método parcial deben ser unsafe o ninguna de ellas puede ser unsafe
  • CS1067: Las declaraciones parciales deben tener los mismos nombres de parámetros de tipo ni modificadores de variancia en el mismo orden
  • CS8142: Ambas declaraciones de miembro parcial deben usar los mismos nombres de elementos de tupla
  • CS8663: Ambas declaraciones de miembro parcial deben ser de solo lectura o ninguna puede ser de solo lectura
  • CS8796: El método parcial debe tener modificadores de accesibilidad porque tiene un tipo de valor devuelto no nulo
  • CS8795: El miembro parcial debe tener una parte de implementación porque tiene modificadores de accesibilidad
  • CS8797: El método parcial debe tener modificadores de accesibilidad porque tiene parámetros "out"
  • CS8798: El método parcial debe tener modificadores de accesibilidad porque tiene un modificador "virtual', 'override", "sealed", "new" o "extern"
  • CS8799: Ambas declaraciones de miembro parcial deben tener modificadores de accesibilidad idénticos
  • CS8800: Ambas declaraciones de miembro parcial deben tener combinaciones idénticas de los modificadores virtual, override, sealed y new
  • CS8817: Ambas declaraciones de método parcial deben tener el mismo tipo de valor devuelto
  • CS8818: Las declaraciones de miembro parcial deben tener valores devueltos ref iguales
  • CS8863: Solo una declaración de tipo parcial puede tener una lista de parámetros
  • CS8988: El modificador scoped del parámetro no coincide con la definición parcial
  • CS9248: La propiedad parcial debe tener una parte de implementación
  • CS9249: La propiedad parcial debe tener una parte de definición
  • CS9250: La propiedad parcial puede no tener varias declaraciones de definición y no puede ser una propiedad automática
  • CS9251: Una propiedad parcial no puede tener varias declaraciones de implementación
  • CS9252: El descriptor de acceso de la propiedad debe implementarse porque se declara en la parte de definición
  • CS9253: El descriptor de acceso de la propiedad no implementa ningún descriptor de acceso declarado en la parte de definición
  • CS9254: El descriptor de acceso de la propiedad debe coincidir con la parte de definición
  • CS9255: Ambas declaraciones de propiedad parcial deben tener el mismo tipo
  • CS9256: Las declaraciones de propiedad parcial tienen diferencias de firma
  • CS9257: Ambas declaraciones de propiedad parcial deben ser obligatorias o ninguna debe ser necesaria
  • 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 que no acepta valores NULL debe contener un valor distinto de NULL al salir del constructor. Considere la posibilidad de agregar el modificador "required" o declarar la propiedad como que acepta valores NULL o agregar atributos "[field: MaybeNull, AllowNull]".*
  • CS9266: un descriptor de acceso de la propiedad debe usar 'field' porque el otro descriptor de acceso lo está usando.

En las secciones siguientes se explica la causa y las soluciones de estos errores y advertencias.

Tipos parciales

  • CS0260: Falta el modificador parcial en la declaración de tipo; ya existe otra declaración parcial de este tipo
  • CS0261: Las declaraciones parciales de tipo deben ser todas las clases, todas las estructuras o todas las interfaces
  • CS0262: Las declaraciones parciales de tipo tienen modificadores de accesibilidad conflictivos
  • CS0263: Las declaraciones parciales de tipo no deben especificar clases base diferentes
  • CS0264: Las declaraciones parciales de tipo deben tener los mismos nombres de parámetros de tipo en el mismo orden
  • CS0265: Las declaraciones parciales de tipo tienen restricciones incoherentes para el parámetro de tipo "type parameter"
  • CS0267: El modificador "partial" solo puede aparecer inmediatamente antes de "class", "record", "struct", "interface", o de un tipo de devolución de propiedad o método.
  • CS8863: Solo una declaración de tipo parcial puede tener una lista de parámetros

La declaración de tipo parcial puede hacer que el compilador genere la siguiente advertencia:

  • CS0282: No hay ninguna ordenación definida entre campos en varias declaraciones de class parcial o struct "type". Para indicar una ordenación, todos los campos de instancia deben estar en la misma declaración

Para cualquier tipo parcial, la palabra clave partial debe estar inmediatamente antes de class, record, struct o interface. El compilador genera un error si aparece en cualquier otro orden. Además:

  • Todas las declaraciones de un tipo parcial deben coincidir según el tipo (class, struct, record class, record struct, readonly structo readonly record struct).
  • Todas las declaraciones deben incluir el modificador partial.
  • Las declaraciones de un tipo parcial genérico deben incluir los mismos parámetros de tipo en el mismo orden.

No es necesario repetir algunas partes de la declaración en todas las declaraciones de un tipo. Sin embargo, si estos elementos se repiten en varias declaraciones partial, sí deben coincidir:

  • Cualquier modificador de acceso, como public.
  • Cualquier clase base o interfaz implementada.
  • Cualquier restricción en parámetros de tipos.

Como máximo, se puede declarar un constructor principal en una declaración de un tipo parcial.

El compilador le advierte si hay varios campos declarados en varios archivos de un tipo partial struct. Si el orden de diseño es importante, debe declarar todos los campos del mismo archivo. Si el orden no importa, puede usar el System.Runtime.InteropServices.StructLayoutAttribute con el valor LayoutKind.Auto.

Miembros parciales

  • CS0750: Un miembro parcial no puede tener el modificador "abstract"
  • CS0751: Un miembro parcial debe declararse en un class parcial o un struct parcial
  • CS0754: Un miembro parcial no puede implementar explícitamente un método de interfaz
  • CS0763: Ambas declaraciones de método parcial deben ser static o ninguna de ellas puede ser static
  • CS0764: Ambas declaraciones de método parcial deben ser unsafe o ninguna de ellas puede ser unsafe
  • CS8142: Ambas declaraciones de miembro parcial deben usar los mismos nombres de elementos de tupla
  • CS8663: Ambas declaraciones de miembro parcial deben ser de solo lectura o ninguna puede ser de solo lectura
  • CS8799: Ambas declaraciones de miembro parcial deben tener modificadores de accesibilidad idénticos
  • CS8800: Ambas declaraciones de miembro parcial deben tener combinaciones idénticas de los modificadores virtual, override, sealed y new
  • CS8818: Las declaraciones de miembro parcial deben tener valores devueltos ref iguales
  • CS8988: El modificador scoped del parámetro no coincide con la definición parcial

Los miembros parciales tienen dos declaraciones. La declaración sin una implementación es la declaración declarante. La declaración con la implementación es la declaración de implementación. Solo se permiten miembros parciales en un tipo partial. Los miembros parciales no pueden ser abstract. Los miembros parciales no pueden implementar explícitamente una interfaz. Ambas declaraciones de un miembro parcial deben tener firmas idénticas. Por ejemplo, ambas declaraciones o ninguna pueden incluir los modificadores static o unsafe.

Métodos parciales

  • CS0501: "member function" debe declarar un cuerpo porque no se marcó como abstract, extern o partial
  • CS0755: Ambas declaraciones de método parcial deben ser métodos de extensión; de lo contrario, no puede serlo ninguna de las dos
  • CS0756: Un método parcial no puede tener varias declaraciones de definición
  • CS0757: Un método parcial no puede tener varias declaraciones de implementación
  • CS0759: No se encuentra ninguna declaración de definición para la declaración de implementación del método parcial
  • CS0761: Las declaraciones de método parcial de method<T> tienen restricciones incoherentes de parámetros de tipo
  • CS0762: No se puede crear un delegado a partir del método porque es un método parcial sin una declaración de implementación
  • CS1067: Las declaraciones parciales deben tener los mismos nombres de parámetros de tipo ni modificadores de variancia en el mismo orden
  • CS8796: El método parcial debe tener modificadores de accesibilidad porque tiene un tipo de valor devuelto no nulo
  • CS8795: El miembro parcial debe tener una parte de implementación porque tiene modificadores de accesibilidad
  • CS8797: El método parcial debe tener modificadores de accesibilidad porque tiene parámetros "out"
  • CS8798: El método parcial debe tener modificadores de accesibilidad porque tiene un modificador "virtual", "override", "sealed", "new" o "extern"
  • CS8817: Ambas declaraciones de método parcial deben tener el mismo tipo de valor devuelto

Algunas declaraciones de método partial no necesitan una declaración de implementación. Es decir, si el miembro devuelve void, no declarará ningún modificador de acceso (incluido el modificador private predeterminado ) y no incluirá ninguno de los modificadores virtual, override, sealed o new. De lo contrario, cualquier método parcial debe incluir tanto las declaraciones declarantes como las de implementación.

Cuando un método parcial incluye una declaración de implementación, ambas declaraciones deben ser idénticas. Se puede definir exactamente una declaración de implementación.

Propiedades parciales

Los errores siguientes indican errores en las declaraciones de propiedad parcial o de indexador:

  • CS9248: La propiedad parcial debe tener una parte de implementación
  • CS9249: La propiedad parcial debe tener una parte de definición
  • CS9250: La propiedad parcial puede no tener varias declaraciones de definición y no puede ser una propiedad automática
  • CS9251: Una propiedad parcial no puede tener varias declaraciones de implementación
  • CS9252: El descriptor de acceso de la propiedad debe implementarse porque se declara en la parte de definición
  • CS9253: El descriptor de acceso de la propiedad no implementa ningún descriptor de acceso declarado en la parte de definición
  • CS9254: El descriptor de acceso de la propiedad debe coincidir con la parte de definición
  • CS9255: Ambas declaraciones de propiedad parcial deben tener el mismo tipo
  • CS9257: Ambas declaraciones de propiedad parcial deben ser obligatorias o ninguna debe ser necesaria

La advertencia siguiente indica una diferencia de firma en la declaración e implementación de declaraciones en una propiedad parcial:

  • CS9256: Las declaraciones de propiedad parcial tienen diferencias de firma

Una propiedad parcial o indexador debe tener una declaración declarante y una declaración de implementación. Las firmas de ambas declaraciones deben coincidir. Dado que la declaración declarante usa la misma sintaxis que una propiedad implementada automáticamente, la declaración de implementación no puede ser una propiedad implementada automáticamente. Los descriptores de acceso deben tener al menos un cuerpo de descriptor de acceso. A partir de C# 13, puede usar la field palabra clave para declarar un descriptor de acceso mediante una sintaxis concisa:

public partial int ImplementingDeclaration { get => field; set; }

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 que no acepta valores NULL debe contener un valor distinto de NULL al salir del constructor. Considere la posibilidad de agregar el modificador "required" o declarar la propiedad como que acepta valores NULL o agregar atributos "[field: MaybeNull, AllowNull]".*
  • CS9266: un descriptor de acceso de la propiedad debe usar 'field' porque el otro descriptor de acceso lo está usando.

Importante

La field palabra clave es una característica en versión preliminar en C# 13. Debe usar .NET 9 y establecer el <LangVersion> elemento preview en en el archivo de proyecto para poder usar la field palabra clave contextual.

Debe tener cuidado con el uso de la field característica de palabra clave en una clase que tenga un campo denominado field. La nueva field palabra clave sombrea un campo denominado field en el ámbito de un descriptor de acceso de propiedad. Puede cambiar el nombre de la field variable o usar el @ token para hacer referencia al field identificador como @field. Para más información, lea la especificación de características de la field palabra clave .

A partir de C# 13, la característica de vista previa, field las propiedades respaldadas permiten acceder al campo de respaldo sintetizado del compilador para una propiedad. CS9258 indica que tiene una variable denominada field, que puede ocultarse mediante la palabra clave fieldcontextual .

CS9263 indica que la declaración declaratoria incluye una implementación. Esa implementación podría estar accediendo al campo de respaldo sintetizado del compilador para esa propiedad. CS9264 indica que el uso de field supone un campo de respaldo que no acepta valores NULL mientras que la declaración de propiedad admite valores NULL. El compilador supone que tanto el campo de respaldo como la propiedad tienen la misma nulabilidad. Debe agregar el [field:MaybeNull, AllowNull] atributo a la declaración de propiedad para indicar que el field valor debe considerarse que acepta valores NULL. CS9266 indica que uno de los descriptores de acceso de propiedades usa la field palabra clave , pero el otro usa un campo de respaldo declarado a mano. La advertencia indica que puede haber hecho eso por accidente.