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.
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,chardoublefloatintlongshortystring),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 = defaultValueen 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
dynamico 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
AttributeTargetsvalor especificado en el atributoAttributeUsagepara 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 = trueen 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.Attributese 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). ElAttributeUsageatributo controla cómo se usan otros atributos y está restringido a las clases de atributos. - Las clases de atributo no pueden ser
abstractporque el compilador debe instanciarlas (CS0653). Quite elabstractmodificador de la clase de atributo o derive una clase concreta de la base abstracta. - Cuando existen clases de atributo
ExampleyExampleAttribute, 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.Interfacea una clase . - Cuando se usa un especificador de destino de atributo como
method:oproperty:, 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:yreturn:. - 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 omodule: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
IndexerNamea los indexadores marcados conoverrideporque los indexadores de invalidación heredan su nombre de la clase base (CS0609). Quite el atributoIndexerNamedel 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 atributoStructLayouta la declaración de tipo contenedor. - El
FieldOffsetatributo no se permite enstaticcampos oconstporque el diseño explícito solo se aplica a los campos de instancia (CS0637). Quite elFieldOffsetatributo 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
DefaultMemberatributo . - 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
Conditionalatributo a métodos de invalidación (CS0243). Quite elConditionalatributo del método override o quite laoverridepalabra clave . - El
Conditionalatributo 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
voidporque 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 avoido quite elConditionalatributo . - Los miembros de la interfaz no pueden ser condicionales porque todos los miembros de interfaz deben implementarse (CS0582). Quite el
Conditionalatributo 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
Conditionalatributo del método de implementación. - Los métodos condicionales no pueden tener
outparámetros porque el valor de laoutvariable sería indefinido cuando el compilador omite la llamada al método (CS0685). Quite losoutparámetros del método o quite elConditionalatributo . - 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
Conditionalatributo del método o no lo use como destino delegado. - El
Conditionalatributo 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
CallerArgumentExpressiondebe tener un tipostringo un tipo con una conversión estándar destring, porque el atributo inserta unastringrepresentación de la expresión de argumento del autor de la llamada (CS8959). Cambie el tipo de parámetro astringo a un tipo compatible. - El
CallerArgumentExpressionatributo 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 elCallerArgumentExpressionatributo del parámetro . - El argumento de cadena pasado al
CallerArgumentExpressionconstructor 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.