Compartir a través de


Errores y advertencias asociados a generadores de origen e interceptores

Los errores siguientes se generan cuando se cargan generadores o interceptores de origen durante una compilación:

  • CS9137: La característica experimental "interceptores" no está habilitada. Agregue <Features>InterceptorsPreview</Features> al proyecto.
  • CS9138: El método no se puede utilizar como interceptor porque él o su tipo contenedor tienen parámetros de tipo.
  • CS9139: No se puede interceptar: la compilación no contiene un archivo con ruta de acceso.
  • CS9140: No se puede interceptar: la compilación no contiene un archivo con ruta de acceso. ¿Quieres usar otra ruta de acceso?
  • CS9141: el número de línea y carácter proporcionados no hace referencia a un nombre de método interceptable, sino a un token.
  • CS9142: el archivo especificado tiene n líneas, que es menor que el número mde línea proporcionado.
  • CS9143: La línea especificada tiene c caracteres de longitud, que es menor que el número de caracteres proporcionados n.
  • CS9144: no se puede interceptar el método M con interceptor V porque las firmas no coinciden.
  • CS9145: No se puede interceptar: la ruta de acceso no está asignada. Se esperaba una ruta de acceso asignada.
  • CS9146: un método interceptor debe ser un método miembro normal.
  • CS9147: el número de línea y carácter proporcionados no hace referencia al inicio de un token. ¿Querías usar líneas n y caracteres c?
  • CS9148: this
  • CS9149: Interceptor no debe tener un this parámetro porque el método no tiene un this parámetro .
  • CS9150: Interceptor no puede tener una null ruta de acceso de archivo.
  • CS9151: No se puede interceptar el nombre de método posible M porque no está siendo invocado.
  • CS9152: no se puede interceptar una llamada en el archivo con esta ruta de acceso porque varios archivos de la compilación tienen esta ruta de acceso.
  • CS9153: la llamada indicada se intercepta varias veces.
  • CS9155: no se puede interceptar la llamada con M porque no es accesible en V.
  • CS9156: No se puede interceptar la llamada a M utilizando V debido a una diferencia en los modificadores 'scoped' o los atributos [UnscopedRef].
  • CS9157: los números de línea y caracteres proporcionados para InterceptsLocationAttribute deben ser positivos.
  • CS9160: no se puede interceptar un operador nameof.
  • CS9161: no se puede marcar un interceptor con UnmanagedCallersOnlyAttribute.
  • CS9177: El interceptor debe ser no genérico o tener aridad coincidente.
  • CS9178: el método debe ser no genérico para que coincida
  • CS9206: no se puede declarar un interceptor en el espacio de nombres global.
  • CS9207: no se puede interceptar porque el método no es una invocación de un método miembro normal.
  • CS9231: el argumento de datos de InterceptsLocationAttribute no tiene el formato correcto.
  • CS9232: no se admite la versión "version" del formato de interceptores. La versión más reciente admitida es "1".
  • CS9233: no se puede interceptar una llamada en el archivo "file" porque está duplicada en otro lugar de la compilación.
  • CS9234: no se puede interceptar una llamada en el archivo 'file' porque no se encontró un archivo coincidente en la compilación.
  • CS9235: el argumento de datos de InterceptsLocationAttribute hace referencia a una posición no válida en el archivo 'file'.

Las advertencias siguientes se generan cuando los generadores o interceptores de origen se cargan durante una compilación:

  • CS8784: El generador "YourSourceGeneratorName" no se pudo inicializar. No contribuirá a la salida, y pueden producirse errores de compilación como resultado.
  • CS8785: El generador 'YourSourceGeneratorName' no pudo generar el código fuente. No contribuirá a la salida y, como resultado, pueden producirse errores de compilación.
  • CS9057: no se puede usar el ensamblado del analizador porque hace referencia a una versión más reciente del compilador que la versión que se está ejecutando actualmente.
  • CS9067: referencia del analizador especificada varias veces.
  • CS9154: Interceptar una llamada a M con interceptor V, pero las firmas no coinciden.
  • CS9158: La nulabilidad de los tipos de referencia en el tipo de retorno no coincide con el método interceptable.
  • CS9159: la nulabilidad de los tipos de referencia en el tipo de parámetro no coincide con el método interceptable.
  • CS9270: no se admite 'InterceptsLocationAttribute(string, int, int)'. Vaya a la generación basada en "InterceptableLocation" de estos atributos en su lugar. (https://github.com/dotnet/roslyn/issues/72133)

Estos errores y advertencias siguen estos temas:

Los interceptores son experimentales

  • CS9137: La característica experimental "interceptores" no está habilitada. Agregue <Features>InterceptorsPreview</Features> al proyecto.

Para usar interceptores, agregue el <Features>InterceptorsPreview</Features> elemento al archivo del proyecto dentro de una <PropertyGroup> sección (CS9137), ya que los interceptores son una característica experimental que no está habilitada de forma predeterminada. Esta participación explícita es necesaria porque la característica interceptores está sujeta a cambios importantes o eliminación en futuras versiones, y el compilador necesita confirmación de que comprende los riesgos antes de permitir su uso. Para obtener más información sobre los interceptores y sus funcionalidades, consulte Interceptores en la documentación de características de C# 12.

Error de coincidencia de firmas

Los errores y advertencias siguientes indican un error de coincidencia entre el método interceptor y el método interceptable.

  • CS9144: no se puede interceptar el método M con interceptor V porque las firmas no coinciden.
  • CS9148: this
  • CS9149: Interceptor no debe tener un this parámetro porque el método no tiene un this parámetro .
  • CS9155: no se puede interceptar la llamada con M porque no es accesible en V.
  • CS9156: No se puede interceptar la llamada a M con V debido a una diferencia en los modificadores "con ámbito" o los atributos [UnscopedRef].
  • CS9177]: El interceptor debe ser no genérico o tener aridad equivalente.
  • CS9178: el método debe ser no genérico para que coincida

Además, los siguientes avisos indican una discrepancia en las firmas del interceptor y del método interceptable.

  • CS9154: Interceptar una llamada a M con interceptor V, pero las firmas no coinciden.
  • CS9158: La nulabilidad de los tipos de referencia en el tipo de retorno no coincide con el método interceptable.
  • CS9159: la nulabilidad de los tipos de referencia en el tipo de parámetro no coincide con el método interceptable.
  • CS9270: no se admite 'InterceptsLocationAttribute(string, int, int)'. Vaya a la generación basada en "InterceptableLocation" de estos atributos en su lugar. (https://github.com/dotnet/roslyn/issues/72133)

Para corregir estos problemas, asegúrese de que el método interceptor coincide con los requisitos de firma y acceso del método interceptable:

  • Asegúrese de que la firma del método interceptor coincide exactamente con el método interceptable (CS9144, CS9154). Los tipos de parámetros, modificadores, orden y tipo de valor devuelto deben ser idénticos. Revise las declaraciones de método y alinee sus signaturas.
  • Agregue un this parámetro al interceptor cuando el método interceptable sea un método de instancia (CS9148) o quite el this parámetro cuando el método interceptable sea estático (CS9149). Los interceptores de instancia requieren un this parámetro del tipo declarante, mientras que los interceptores estáticos no deben tener uno.
  • Declare el interceptor en una ubicación donde el método interceptable sea accesible (CS9155). Si el método interceptable es internal, el interceptor debe estar en el mismo ensamblado. Si es private, el interceptor debe estar en el mismo tipo o en un tipo anidado.
  • Haz coincidir los modificadores scoped y los atributos [UnscopedRef] en los parámetros ref correspondientes (CS9156). Cada ref parámetro del interceptor debe tener las mismas anotaciones de duración que el parámetro correspondiente en el método interceptable para garantizar la seguridad de la memoria.
  • Asegúrese de que ambos métodos tienen aridad genérica coincidente (CS9177, CS9178). Si el método interceptable no es genérico, el interceptor también debe ser no genérico. Si el método interceptable tiene parámetros de tipo, el interceptor debe tener el mismo número de parámetros de tipo con restricciones compatibles.
  • Ajusta las anotaciones de nulabilidad en el tipo de valor devuelto (CS9158) y en los tipos de parámetro (CS9159). Habilite los tipos de referencia anulables en su proyecto y asegúrese de que las anotaciones de anulabilidad del interceptador coincidan exactamente con el método interceptable para mantener la seguridad de tipos.
  • Utiliza el generador basado en la versión actualizada de InterceptableLocation para InterceptsLocationAttribute, en lugar del constructor obsoleto (string, int, int) (CS9270). El formato más reciente proporciona una mejor compatibilidad con las herramientas y la validación en tiempo de compilación. Consulte el problema de GitHub para obtener instrucciones de migración.

Asignación incorrecta

Los interceptores requieren un mapeo de origen que relacione el método interceptable y el método interceptor. Los errores siguientes indican un problema con la asignación:

  • CS9139: No se puede interceptar: la compilación no contiene un archivo con ruta de acceso.
  • CS9140: No se puede interceptar: la compilación no contiene un archivo con ruta de acceso. ¿Quieres usar otra ruta de acceso?
  • CS9141: el número de línea y carácter proporcionados no hace referencia a un nombre de método interceptable, sino a un token.
  • CS9142: el archivo especificado tiene n líneas, que es menor que el número mde línea proporcionado.
  • CS9143: La línea especificada tiene una longitud de c caracteres, que es menor que el número de caracteres proporcionados n.
  • CS9145: No se puede interceptar: la ruta de acceso no está asignada. Se esperaba una ruta de acceso asignada.
  • CS9147: el número de línea y carácter proporcionados no hace referencia al inicio de un token. ¿Querías usar líneas n y caracteres c?
  • CS9150: Interceptor no puede tener una null ruta de acceso de archivo.
  • CS9157: los números de línea y caracteres proporcionados para InterceptsLocationAttribute deben ser positivos.

Para corregir los errores de mapeo, asegúrese de que su InterceptsLocationAttribute contenga rutas de acceso de archivo válidas e información de posición precisa.

  • Compruebe que la ruta de acceso del archivo coincide exactamente con un archivo de la compilación (CS9139, CS9140). Utiliza la ruta exacta tal como aparece en tu proyecto, incluidos los separadores de directorio y respetando el uso correcto de mayúsculas y minúsculas. Si el compilador sugiere una ruta de acceso alternativa, actualice el atributo para usar esa ruta de acceso.
  • Use rutas de archivos asignadas al trabajar con generadores de código fuente que transforman rutas de archivos (CS9145). Los generadores de origen suelen reasignar las rutas de acceso para los archivos generados y debe usar la ruta de acceso asignada que el compilador reconoce, no la ruta de acceso de origen original.
  • Asegúrese de que la ruta del archivo no esté en null (InterceptsLocationAttribute). Cada interceptación debe especificar una ruta de acceso de archivo válida que no sea NULL que identifique el archivo de origen que contiene la llamada a interceptación.
  • Proporcione números de líneas y caracteres positivos basados en 1 (CS9157). Los números de línea y las posiciones de caracteres deben comenzar en 1, no en 0. Compruebe que el generador de origen usa la indexación basada en 1 al calcular posiciones.
  • Señale el inicio exacto del token del nombre del método (CS9141, CS9147). Los números de línea y carácter deben identificar el primer carácter del nombre del método en la invocación, no espacios en blanco, operadores u otros tokens. Si el compilador sugiere coordenadas alternativas, úselos para establecer como destino el inicio correcto del token.
  • Permanezca dentro de los límites del archivo (CS9142, CS9143). Compruebe que el número de línea no supera el recuento total de líneas y el número de caracteres no supera la longitud de línea. Vuelva a calcular las posiciones si el archivo de origen ha cambiado desde que se generó el atributo.

Declaración incorrecta del interceptor

Los errores siguientes indican problemas con las declaraciones del interceptor, incluidos los problemas con el InterceptsLocationAttribute formato o las infracciones de las reglas del interceptor:

  • CS9138: El método no se puede usar como interceptor porque él mismo o su tipo contenedor tienen parámetros de tipo.
  • CS9146: un método interceptor debe ser un método miembro normal.
  • CS9151: No se puede interceptar el posible nombre del método M porque no se está invocando.
  • CS9152: no se puede interceptar una llamada en el archivo con esta ruta de acceso porque varios archivos de la compilación tienen esta ruta de acceso.
  • CS9153: la llamada indicada se intercepta varias veces.
  • CS9160: no se puede interceptar un operador nameof.
  • CS9161: no se puede marcar un interceptor con UnmanagedCallersOnlyAttribute.
  • CS9206: no se puede declarar un interceptor en el espacio de nombres global.
  • CS9207: no se puede interceptar porque el método no es una invocación de un método miembro normal.
  • CS9231: el argumento de datos de InterceptsLocationAttribute no tiene el formato correcto.
  • CS9232: No se soporta la versión "version" del formato de interceptores. La última versión soportada es "1".
  • CS9233: no se puede interceptar una llamada en el archivo "file" porque está duplicada en otro lugar de la compilación.
  • CS9234: no se puede interceptar una llamada en el archivo 'file' porque no se encontró un archivo coincidente en la compilación.
  • CS9235: el argumento de datos de InterceptsLocationAttribute hace referencia a una posición no válida en el archivo 'file'.

Para corregir los errores de declaración del interceptor, siga estas reglas para las declaraciones válidas del interceptor y el uso válido de InterceptsLocationAttribute.

  • Dé formato al InterceptsLocationAttribute argumento de datos correctamente (CS9231). El atributo requiere datos estructurados específicamente que codifican la ruta de acceso del archivo y la información de posición. Asegúrese de que el generador de origen genera datos en el formato esperado que coincida con la especificación de interceptores actuales.
  • Use la versión "1" en InterceptsLocationAttribute (CS9232), ya que es la versión compatible más reciente. Actualice su generador de origen para que produzca atributos de formato de la versión 1 en lugar de usar números de versión no admitidos.
  • Asegúrese de que las rutas de acceso de archivo sean únicas en su compilación (CS9233, CS9234). Cuando la compilación contiene rutas de acceso de archivo duplicadas, cambie el nombre o reorganice los archivos para que cada ruta de acceso sea única. Compruebe que la ruta de acceso del archivo especificada en el atributo coincide realmente con un archivo incluido en la compilación.
  • Valide los puntos de datos de posición en ubicaciones de código válidas (CS9235). Los números de línea y carácter deben hacer referencia a un punto de interceptación válido dentro del archivo especificado. Vuelva a generar el atributo si el archivo de origen ha cambiado o si la posición está fuera de los límites del archivo.
  • Declare métodos de interceptor no genéricos en tipos no genéricos (CS9138). Los interceptores no pueden tener parámetros de tipo en el propio método o en su tipo contenedor. Si necesita interceptar un método genérico, cree un interceptor no genérico que funcione con el tipo construido específico.
  • Haga que los interceptores sean métodos de miembro ordinario (CS9146). Los interceptores no pueden ser operadores, constructores, finalizadores, propiedades o indexadores. Declara tu interceptor como un método estático o de instancia normal.
  • Intercepte invocaciones de método reales, no expresiones (CS9151, CS9207). Solo puede interceptar llamadas a métodos miembros normales que están siendo invocados. No se pueden interceptar grupos de métodos, delegados ni métodos a los que se hace referencia sin ser llamados. Asegúrese de que la ubicación interceptable identifica una llamada de método real.
  • Quite los intentos de interceptación duplicados (CS9153). Cada llamada de método solo se puede interceptar una vez. Si varias instancias InterceptsLocationAttribute apuntan a la misma llamada, quite todas excepto una para resolver la ambigüedad.
  • No interfiera con nameof operadores (CS9160). El nameof operador no invoca métodos en tiempo de ejecución, por lo que no se puede interceptar. Intercepte solo las llamadas de método reales que se ejecutan en tiempo de ejecución.
  • Eliminar UnmanagedCallersOnlyAttribute de interceptores (CS9161). Los interceptores deben llamarse desde código administrado y no se pueden marcar con UnmanagedCallersOnlyAttribute. Quite el atributo de la declaración del método interceptor.
  • Declarar interceptores dentro de un espacio de nombres (CS9206). Los interceptores no se pueden declarar en el espacio de nombres global y deben estar contenidos en al menos una declaración de espacio de nombres. Encapsula la clase "interceptor" en un espacio de nombres.
  • Resuelva las rutas de acceso de archivo duplicadas en el nivel de compilación (CS9152). Cuando varios archivos comparten la misma ruta de acceso en la compilación, el compilador no puede determinar en qué archivo se va a interceptar. Asegúrese de que la configuración de compilación genera rutas de acceso de archivo únicas o usa una estrategia de organización diferente para los archivos de origen.

Compatibilidad del analizador

Las advertencias siguientes indican problemas con los ensamblados del analizador o del generador de origen:

  • CS9057: no se puede usar el ensamblado del analizador porque hace referencia a una versión más reciente del compilador que la versión que se está ejecutando actualmente.
  • CS9067: referencia del analizador especificada varias veces.

Estas advertencias se producen cuando hay problemas de compatibilidad con los ensamblados del analizador:

  • CS9057 se genera cuando un ensamblado del analizador hace referencia a una versión del compilador de Roslyn que es más reciente que la que se está ejecutando actualmente. Esto impide que el analizador se cargue porque puede depender de las API o los comportamientos que no están disponibles en la versión actual del compilador. Para resolverlo, actualice el compilador o el SDK para que coincida con los requisitos del analizador o use una versión del analizador compatible con la versión del compilador actual.
  • CS9067 advierte cuando se hace referencia varias veces al mismo ensamblado del analizador en el proyecto. Esto suele ocurrir cuando se incluye un analizador a través de varias rutas de acceso o referencias de paquete. Aunque no es un error, las referencias duplicadas pueden afectar al rendimiento de la compilación y pueden provocar un comportamiento inesperado. Quite las referencias duplicadas para resolver esta advertencia.