Compartir a través de


Resolución de errores y advertencias relacionados con declaraciones de atributos o uso de atributos en el código

En este artículo se tratan los siguientes errores del compilador:

  • CS0181: el parámetro del constructor de atributos tiene un tipo, que no es un tipo de parámetro de atributo válido.
  • CS0243: el atributo Conditional no es válido en 'method' porque es un método de invalidación.
  • CS0404: el atributo no es válido en este tipo de declaración.
  • CS0415: este atributo solo es válido en un indexador que no es una declaración explícita de miembro de interfaz.
  • CS0416: 'parámetro de tipo': un argumento de atributo no puede usar parámetros de tipo.
  • CS0447: El atributo no se puede usar con argumentos de tipo.
  • CS0577: el atributo Condicional no es válido porque es un constructor, destructor, operador, expresión lambda o implementación de interfaz explícita.
  • CS0578: el atributo Condicional no es válido en 'function' porque su tipo de valor devuelto no es nulo.
  • CS0579: Atributo duplicado
  • CS0582: el atributo Condicional no es válido en los miembros de la interfaz.
  • CS0592: el atributo no es válido en este tipo de declaración. Solo es válido en declaraciones específicas.
  • CS0609: no se puede establecer el atributo en un indexador marcado como invalidación.
  • CS0616: El tipo no es una clase de atributo
  • CS0625: el campo de instancia de los tipos marcados con StructLayout(LayoutKind.Explicit) debe tener un atributo FieldOffset.
  • CS0629: el miembro condicional 'member' no puede implementar el miembro de interfaz 'miembro de clase base' en el tipo 'Nombre de tipo'.
  • CS0636: el atributo FieldOffset solo se puede colocar en miembros de tipos marcados con StructLayout(LayoutKind.Explicit).
  • CS0637: El atributo FieldOffset no está permitido en campos estáticos o const.
  • CS0641: este atributo solo es válido en las clases derivadas de System.Attribute".
  • CS0646: no se puede especificar el atributo DefaultMember en un tipo que contiene un indexador.
  • CS0647: Error al emitir el atributo
  • CS0653: no se puede aplicar la clase de atributo 'class' porque es abstracta.
  • CS0657: La ubicación no es una ubicación de atributo válida para esta declaración. Se muestran las ubicaciones de atributo válidas para esta declaración. Se omitirán todos los atributos de este bloque.
  • CS0658: la ubicación no es una ubicación de atributo reconocida. Se muestran las ubicaciones de atributo válidas para esta declaración. Se omitirán todos los atributos de este bloque.
  • CS0668: dos indexadores tienen nombres diferentes; el atributo IndexerName debe usarse con el mismo nombre en cada indexador dentro de un tipo.
  • CS0685: El miembro condicional 'member' no puede tener un parámetro de salida.
  • CS0735: tipo no válido especificado como argumento para el atributo TypeForwardedTo
  • CS0739: Duplicate TypeForwardedToAttribute
  • CS1608: El atributo RequiredAttribute no está permitido en los tipos de C#
  • CS1614: el nombre del atributo es ambiguo. Use "@name" o incluya explícitamente el sufijo "Attribute".
  • CS1618: No se puede crear un delegado con el método porque su método o uno que sobrescribe tiene un atributo condicional
  • CS1667: el atributo no es válido en los descriptores de acceso de propiedad o evento. Solo es válido en declaraciones específicas.
  • CS1689: el atributo solo es válido en métodos o clases de atributo
  • CS7014: los atributos no son válidos en este contexto.
  • CS7046: se debe especificar el parámetro attribute.
  • CS7047: se debe especificar el parámetro de atributo 'parameter1' o 'parameter2'.
  • CS7067: el parámetro del constructor de atributos es opcional, pero no se especificó ningún valor de parámetro predeterminado.
  • CS8959: No se puede aplicar CallerArgumentExpressionAttribute porque no hay conversiones estándar de type1 a type2
  • CS8960: El objeto CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. El objeto CallerLineNumberAttribute lo invalida.
  • CS8961: El objeto CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. El objeto CallerFilePathAttribute lo invalida.
  • CS8962: El CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. Se invalida mediante el CallerMemberNameAttribute.
  • CS8963: El objeto CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. Se aplica con un nombre de parámetro no válido.
  • CS8968: Un argumento de tipo de atributo no puede usar parámetros de tipo
  • CS8970: El tipo no se puede usar en este contexto porque no se puede representar en los metadatos.
  • CS9331: El atributo no se puede aplicar manualmente.

Argumentos y parámetros de atributo

Verá los errores siguientes cuando se usan argumentos de atributo o parámetros incorrectamente:

  • CS0181: el parámetro del constructor de atributos tiene un tipo, que no es un tipo de parámetro de atributo válido.
  • CS0416: 'parámetro de tipo': un argumento de atributo no puede usar parámetros de tipo.
  • CS0447: El atributo no se puede usar con argumentos de tipo.
  • CS0647: Error al emitir el atributo
  • CS7046: se debe especificar el parámetro attribute.
  • CS7047: se debe especificar el parámetro de atributo 'parameter1' o 'parameter2'.
  • CS7067: el parámetro del constructor de atributos es opcional, pero no se especificó ningún valor de parámetro predeterminado.
  • CS8968: Un argumento de tipo de atributo no puede usar parámetros de tipo
  • CS8970: El tipo no se puede usar en este contexto porque no se puede representar en los metadatos.

Para corregir estos errores, siga estas reglas:

  • Los parámetros del constructor de atributos deben usar tipos de parámetros de atributo válidos (CS0181). La especificación del lenguaje C# restringe los tipos de parámetros de atributo a tipos primitivos (bool, byte, chardoublefloatintlongshorty string), object, System.Typetipos de enumeración y matrices unidimensionales de estos tipos. Los punteros de función y otros tipos que no se pueden representar en los metadatos no son tipos de parámetros de atributo válidos.
  • Los argumentos de atributo deben ser valores constantes en tiempo de compilación, por lo que no se pueden usar parámetros de tipo como argumentos de atributo (CS0416). El compilador debe resolver argumentos de atributo en tiempo de compilación y los parámetros de tipo no se conocen hasta que se construye el tipo genérico.
  • No se pueden aplicar argumentos de tipo a un atributo no genérico (CS0447). Si una clase de atributo no es genérica, su uso no puede incluir argumentos de tipo entre corchetes angulares.
  • Todos los valores pasados a un constructor de atributos deben tener el formato correcto y dentro del intervalo válido para cada parámetro (CS0647). Por ejemplo, un GuidAttribute requiere una cadena de formato GUID válida.
  • Debe proporcionar todos los parámetros de atributo necesarios al aplicar el atributo (CS7046, CS7047). Compruebe la firma del constructor del atributo para determinar qué parámetros son obligatorios y proporcione argumentos válidos para cada parámetro.
  • Al definir un atributo personalizado con parámetros de constructor opcionales, especifique los valores predeterminados para esos parámetros (CS7067). Use la sintaxis parameterType parameterName = defaultValue en el constructor de atributos para que los llamadores puedan omitir esos argumentos.
  • Los argumentos de tipo de atributo genérico deben ser tipos concretos, no parámetros de tipo (CS8968). El compilador debe determinar completamente los argumentos de tipo de atributo genérico en tiempo de compilación, por lo que no se permiten parámetros de tipo abiertos.
  • Los tipos usados como argumentos de atributo deben representarse en los metadatos (CS8970). Algunos tipos construidos, como los que implican dynamic o determinados nombres de elementos de tupla, no se pueden codificar en metadatos y no se permiten como argumentos de tipo de atributo.

Para obtener más información, vea atributos, genéricos y la sección especificación del lenguaje C# sobre atributos.

Nota:

CS0447 y CS0647 están en desuso. El compilador actual no emite estos errores.

Requisitos de clase de atributo

Verá los errores siguientes al definir clases de atributo que no cumplan las restricciones necesarias:

  • CS0404: el atributo no es válido en este tipo de declaración.
  • CS0579: Atributo duplicado
  • CS0616: El tipo no es una clase de atributo
  • CS0641: este atributo solo es válido en las clases derivadas de System.Attribute".
  • CS0653: no se puede aplicar la clase de atributo 'class' porque es abstracta.
  • CS1614: el nombre del atributo es ambiguo. Use "@name" o incluya explícitamente el sufijo "Attribute".

Para corregir estos errores, siga estas reglas:

  • Aplique atributos solo a los tipos de declaración que el atributo AttributeUsageAttribute permite (CS0404). Compruebe el AttributeTargets valor especificado en el atributo AttributeUsage para ver qué destinos son válidos.
  • Si aplica el mismo atributo más de una vez a un único destino, quite el duplicado o establezca AllowMultiple = true en el atributo AttributeUsageAttribute (CS0579). De forma predeterminada, los atributos solo pueden aparecer una vez en cada destino.
  • El tipo usado en la sintaxis de atributo debe heredar de System.Attribute (CS0616). Solo las clases derivadas de System.Attribute se pueden usar como atributos. Otros tipos provocan este error incluso si tienen un nombre similar.
  • Solo se puede aplicar AttributeUsageAttribute a las clases que derivan de Attribute (CS0641). El AttributeUsage atributo controla cómo se usan otros atributos y está restringido a las clases de atributos.
  • Las clases de atributo no pueden ser abstract porque el compilador debe instanciarlas (CS0653). Quite el abstract modificador de la clase de atributo o derive una clase concreta de la base abstracta.
  • Cuando existen clases de atributo Example y ExampleAttribute, el compilador no puede determinar a qué [Example] se refiere (CS1614). Desambiguate usando [@Example] para el nombre más corto o [ExampleAttribute] para el nombre más largo.

Para obtener más información, consulte la sección Creación de atributos personalizados y especificación del lenguaje C# sobre atributos.

Contexto de ubicación de atributo

Los errores siguientes se producen cuando se aplican atributos en ubicaciones no válidas o se usan especificadores de destino incorrectos:

  • CS0592: el atributo no es válido en este tipo de declaración. Solo es válido en declaraciones específicas.
  • CS0657: La ubicación no es una ubicación de atributo válida para esta declaración. Se muestran las ubicaciones de atributo válidas para esta declaración. Se omitirán todos los atributos de este bloque.
  • CS0658: la ubicación no es una ubicación de atributo reconocida. Se muestran las ubicaciones de atributo válidas para esta declaración. Se omitirán todos los atributos de este bloque.
  • CS1667: el atributo no es válido en los descriptores de acceso de propiedad o evento. Solo es válido en declaraciones específicas.
  • CS7014: los atributos no son válidos en este contexto.

Para corregir estos errores, siga estas reglas. Para obtener más información, vea Destinos de atributo y la sección de la especificación del lenguaje C# sobre la especificación de atributos.

  • Cada atributo AttributeUsageAttribute especifica qué tipos de declaración tiene como destino. Debe aplicar el atributo solo a esos tipos (CS0592). Por ejemplo, no se puede aplicar un atributo definido con AttributeTargets.Interface a una clase .
  • Cuando se usa un especificador de destino de atributo como method: o property:, el especificador debe ser válido para la declaración donde aparece (CS0657). Compruebe el mensaje de error para ver qué especificadores de destino están permitidos para la declaración específica.
  • El especificador de destino de atributo que usó no es un especificador reconocido (CS0658). Los especificadores válidos incluyen assembly:, module:, type:, method:property:, field:, event:, , param:y return:.
  • Algunos atributos, como ObsoleteAttribute y CLSCompliantAttribute, no son válidos en los descriptores de acceso de propiedad o evento (CS1667). Mueva el atributo del descriptor de acceso a la propiedad o a la propia declaración de evento.
  • Los atributos solo pueden aparecer en elementos de programa que los admitan (CS7014). Si va a aplicar atributos de nivel de ensamblado o de módulo, use los assembly: especificadores de destino o module: y colóquelos en la parte superior del archivo.

Atributos predefinidos

Los errores siguientes se producen cuando se usan atributos de .NET predefinidos específicos incorrectamente:

  • CS0415: este atributo solo es válido en un indexador que no es una declaración explícita de miembro de interfaz.
  • CS0609: No se puede establecer un atributo en un indexador marcado como sobrescritura.
  • CS0625: el campo de instancia de los tipos marcados con StructLayout(LayoutKind.Explicit) debe tener un atributo FieldOffset.
  • CS0636: el atributo FieldOffset solo se puede colocar en miembros de tipos marcados con StructLayout(LayoutKind.Explicit).
  • CS0637: El atributo FieldOffset no está permitido en campos estáticos o const.
  • CS0646: no se puede especificar el atributo DefaultMember en un tipo que contiene un indexador.
  • CS0668: dos indexadores tienen nombres diferentes; el atributo IndexerName debe usarse con el mismo nombre en cada indexador dentro de un tipo.
  • CS0735: tipo no válido especificado como argumento para el atributo TypeForwardedTo
  • CS0739: Duplicate TypeForwardedToAttribute
  • CS1608: El atributo RequiredAttribute no está permitido en los tipos de C#
  • CS9331: El atributo no se puede aplicar manualmente.

Para corregir estos errores, siga estas reglas. Para obtener más información, vea Indexadores, tipos de estructura, TypeForwardedToAttributee Invocación de plataforma (P/Invoke).

  • Solo IndexerNameAttribute se puede aplicar a los indexadores que no son declaraciones explícitas de miembros de interfaz (CS0415). Quite el atributo de los indexadores de interfaz explícitos, ya que la interfaz ya define el nombre del indexador.
  • No se puede aplicar IndexerName a los indexadores marcados con override porque los indexadores de invalidación heredan su nombre de la clase base (CS0609). Quite el atributo IndexerName del indexador de sobreescritura.
  • Cada campo de instancia de un tipo marcado con StructLayout(LayoutKind.Explicit) debe tener un FieldOffsetAttribute (CS0625). El diseño explícito requiere que especifique el desplazamiento de bytes para cada campo de instancia.
  • El FieldOffsetAttribute solo se puede colocar en miembros de tipos que tienen StructLayoutAttribute establecido en LayoutKind.Explicit (CS0636). Agregue el atributo StructLayout a la declaración de tipo contenedor.
  • El FieldOffset atributo no se permite en static campos o const porque el diseño explícito solo se aplica a los campos de instancia (CS0637). Quite el FieldOffset atributo del campo estático o const.
  • No se puede aplicar DefaultMemberAttribute a un tipo que ya contiene un indexador porque el compilador define automáticamente el miembro predeterminado para los tipos con indexadores (CS0646). Quite el DefaultMember atributo .
  • Todos los IndexerNameAttribute atributos de un tipo deben especificar el mismo nombre (CS0668). Cambie los nombres para que coincidan, ya que el tiempo de ejecución usa un único nombre para todos los indexadores de un tipo.
  • El tipo especificado como argumento para TypeForwardedToAttribute debe ser un tipo no genérico, no anidado, no puntero, no de matriz (CS0735). Solo los tipos con nombre de nivel superior son destinos de reenvío válidos.
  • Un ensamblado solo puede tener uno TypeForwardedToAttribute para cada tipo externo (CS0739). Busque y quite la declaración duplicada TypeForwardedTo .
  • RequiredAttributeAttribute No se permite en los tipos definidos en C# (CS1608). Este atributo está reservado para otros lenguajes que necesitan forzar a los compiladores a requerir una característica determinada.
  • Algunos atributos están reservados para el compilador y no se pueden aplicar manualmente en el código fuente (CS9331). Reemplace el atributo por la sintaxis del lenguaje C# equivalente que hace que el compilador lo genere.

Uso de atributos condicionales

Verá los siguientes errores al aplicar ConditionalAttribute de maneras que infringen sus restricciones de uso.

  • CS0243: el atributo Conditional no es válido en 'method' porque es un método de invalidación.
  • CS0577: el atributo Condicional no es válido porque es un constructor, destructor, operador, expresión lambda o implementación de interfaz explícita.
  • CS0578: el atributo Condicional no es válido en 'function' porque su tipo de valor devuelto no es nulo.
  • CS0582: el atributo Condicional no es válido en los miembros de la interfaz.
  • CS0629: el miembro condicional 'member' no puede implementar el miembro de interfaz 'miembro de clase base' en el tipo 'Nombre de tipo'.
  • CS0685: El miembro condicional 'member' no puede tener un parámetro out.
  • CS1618: No se puede crear un delegado con el método porque este o un método que sobrescribe tiene un atributo condicional
  • CS1689: el atributo solo es válido en métodos o clases de atributo

Para corregir estos errores, siga estas reglas. Para obtener más información, vea ConditionalAttribute, Métodos condicionales y Atributos.

  • El compilador enlaza llamadas a la declaración del método base, no a la invalidación, por lo que no se puede aplicar el Conditional atributo a métodos de invalidación (CS0243). Quite el Conditional atributo del método override o quite la override palabra clave .
  • El Conditional atributo no es válido en constructores, finalizadores, operadores, expresiones lambda o implementaciones de interfaz explícitas (CS0577). Estos tipos de miembro no se pueden omitir condicionalmente porque tienen roles necesarios en el ciclo de vida o contrato del tipo.
  • Los métodos condicionales deben devolverse void porque el compilador podría omitir la llamada por completo y ningún valor devuelto estaría disponible para el autor de la llamada (CS0578). Cambie el tipo de valor devuelto del método a voido quite el Conditional atributo .
  • Los miembros de la interfaz no pueden ser condicionales porque todos los miembros de interfaz deben implementarse (CS0582). Quite el Conditional atributo de la declaración de miembro de interfaz.
  • Los métodos que implementan miembros de interfaz no pueden ser condicionales porque el contrato de interfaz requiere que estén presentes en todas las compilaciones (CS0629). Quite el Conditional atributo del método de implementación.
  • Los métodos condicionales no pueden tener out parámetros porque el valor de la out variable sería indefinido cuando el compilador omite la llamada al método (CS0685). Quite los out parámetros del método o quite el Conditional atributo .
  • No se puede crear un delegado que haga referencia a un método condicional porque es posible que el método no exista en compilaciones donde el símbolo de condición no esté definido (CS1618). Quite el Conditional atributo del método o no lo use como destino delegado.
  • El Conditional atributo solo es válido en métodos y clases de atributo (CS1689). No es válido en otros tipos de declaración, como clases que no son atributos, estructuras o interfaces.

Uso del atributo CallerArgumentExpression

Los errores siguientes se producen cuando se aplica CallerArgumentExpressionAttribute incorrectamente o en conflicto con otros atributos de información del autor de la llamada:

  • CS8959: No se puede aplicar CallerArgumentExpressionAttribute porque no hay conversiones estándar de type1 a type2
  • CS8960: El objeto CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. El objeto CallerLineNumberAttribute lo invalida.
  • CS8961: El objeto CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. El objeto CallerFilePathAttribute lo invalida.
  • CS8962: El atributo CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. Se invalida mediante CallerMemberNameAttribute.
  • CS8963: El objeto CallerArgumentExpressionAttribute aplicado al parámetro no tendrá ningún efecto. Se aplica con un nombre de parámetro no válido.

Para corregir estos errores, siga estas reglas. Para obtener más información, vea Atributos de información del llamante y CallerArgumentExpressionAttribute.

  • El parámetro decorado con CallerArgumentExpression debe tener un tipo string o un tipo con una conversión estándar de string, porque el atributo inserta una string representación de la expresión de argumento del autor de la llamada (CS8959). Cambie el tipo de parámetro a string o a un tipo compatible.
  • El CallerArgumentExpression atributo no tiene ningún efecto en un parámetro que también tiene CallerLineNumberAttribute, CallerFilePathAttributeo CallerMemberNameAttribute (CS8960, CS8961, CS8962). Esos atributos de información del autor de la llamada tienen prioridad, por lo que quita el CallerArgumentExpression atributo del parámetro .
  • El argumento de cadena pasado al CallerArgumentExpression constructor debe coincidir con el nombre de otro parámetro en la misma firma de método (CS8963). Si el nombre del parámetro está mal escrito o hace referencia a un parámetro inexistente, el atributo no tiene ningún efecto.