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 y advertencias del compilador:
- CS0171: el campo 'name' debe asignarse completamente antes de que el control se devuelva al autor de la llamada. Considere la posibilidad de actualizar a la versión de idioma "version" para que el campo sea el predeterminado automático.
- CS0188: el objeto 'this' no se puede usar antes de que se hayan asignado todos sus campos. Considere la posibilidad de actualizar a la versión de idioma "version" para establecer automáticamente los campos sin asignar.
- CS0843: La propiedad "name" implementada automáticamente debe asignarse completamente antes de que se devuelva el control al autor de la llamada. Considere la posibilidad de actualizar a la versión de idioma "version" para que la propiedad sea predeterminada automáticamente.
- CS1617: opción 'option' no válida para /langversion. Use '/langversion:?' para enumerar los valores admitidos.
- CS1638: 'identifier' es un identificador reservado y no se puede usar cuando se usa el modo de versión del lenguaje ISO
- CS1738: Las especificaciones de argumentos con nombre deben aparecer después de que se hayan especificado todos los argumentos fijos. Use la versión de idioma 7.2 o posterior para permitir argumentos con nombre que no estén al final.
- CS8021: no se encontró ningún valor para RuntimeMetadataVersion. No se encontró ningún ensamblado que contenga System.Object ni se especificó un valor para RuntimeMetadataVersion a través de las opciones.
- CS8022: La característica no está disponible en C# 1. Use la versión 2 o posterior del idioma.
- CS8023: la característica no está disponible en C# 2. Use la versión 3 o posterior del idioma.
- CS8024: la característica no está disponible en C# 3. Use la versión 4 o posterior del idioma.
- CS8025: la característica no está disponible en C# 4. Use la versión 5 o posterior del idioma.
- CS8026: la característica no está disponible en C# 5. Use la versión de idioma 6 o posterior.
- CS8058: la característica "feature" es experimental y no es compatible; use "/features:feature" para habilitar.
- CS8059: la característica no está disponible en C# 6. Use la versión 7 o posterior del idioma.
- CS8107: la característica no está disponible en C# 7.0. Use la versión 7.1 o posterior del idioma.
- CS8192: la versión del lenguaje proporcionada no es compatible o no es válida: "value".
- CS8302: la característica no está disponible en C# 7.1. Use la versión 7.2 o posterior del idioma.
- CS8303: La versión del lenguaje especificada "value" no puede tener ceros iniciales
- CS8304: versión del compilador: "version". Versión del idioma: versión.
- CS8305: 'type' es solo para fines de evaluación y está sujeto a cambios o eliminación en futuras actualizaciones.
- CS8306: El nombre del elemento de tupla "name" se infiere. Use la versión 7.1 o posterior del lenguaje para acceder a un elemento por su nombre inferido.
- CS8314: una expresión de tipo 'type' no se puede controlar mediante un patrón de tipo 'type' en la versión de C#. Use la versión de idioma "version" o superior.
- CS8320: la característica no está disponible en C# 7.2. Use la versión 7.3 o posterior del idioma.
- CS8370: la característica no está disponible en C# 7.3. Use la versión 8 o posterior del idioma.
- CS8371: los atributos de destino de campo en las propiedades automáticas no se admiten en la versión 7.3 del lenguaje. Use la versión 8.0 o posterior del idioma.
- CS8400: la característica no está disponible en C# 8. Use la versión 9 o posterior del idioma.
- CS8401: Para usar '@$' en lugar de '$@' para una cadena textual interpolada, use la versión de idioma 8.0 o posterior.
- CS8511: una expresión de tipo 'type' no se puede controlar mediante un patrón de tipo 'type'. Use la versión de idioma "version" o posterior para que coincida con un tipo abierto con un patrón constante.
- CS8627: Debe saberse que un parámetro de tipo anulable es un tipo de valor o un tipo de referencia no anulable, a menos que se use la versión del lenguaje 'version' o posterior. Considere cambiar la versión del lenguaje o agregar una restricción 'class', 'struct' o de tipo.
- CS8630: Valor no válido de la opción 'option': 'value' para la versión de C#. Use la versión del lenguaje 'version' o una posterior.
- CS8652: la característica se encuentra actualmente en versión preliminar y no es compatible. Para usar las características en versión preliminar, use la versión del lenguaje "preview".
- CS8701: el entorno de ejecución de destino no admite la implementación predeterminada de la interfaz.
- CS8702: 'member' no puede implementar el miembro de interfaz 'member' en el tipo 'type' porque el tiempo de ejecución de destino no admite la implementación de interfaz predeterminada.
- CS8703: el modificador 'modificador' no es válido para este elemento en la versión de C#. Use la versión 8.0 o posterior del idioma.
- CS8704: 'type' no implementa el miembro de interfaz 'member'. 'type' no puede implementar implícitamente un miembro no público en la versión de C#. Use la versión de idioma "version" o superior.
- CS8706: El tipo no puede implementar el miembro de interfaz en el tipo porque la característica no está disponible en C# 7.3.
- CS8707: el entorno de ejecución de destino no admite la accesibilidad "protected", "protected internal" o "private protected" para un miembro de una interfaz.
- CS8773: La característica no está disponible en C# 9. Use la versión 10 o posterior del idioma.
- CS8830: El entorno de ejecución de destino no admite tipos de valor devuelto covariantes en reemplazos. El tipo de valor devuelto debe ser 'type' para que coincida con el miembro reemplazado 'member'.
- CS8831: el entorno de ejecución de destino no admite tipos covariantes en invalidaciones. El tipo debe ser 'type' para que coincida con el miembro invalidado 'member'.
- CS8888: la convención de llamada "administrada" no se puede combinar con especificadores de convención de llamada no administrados.
- CS8889: el entorno de ejecución de destino no admite convenciones de llamada predeterminadas extensibles o del entorno en tiempo de ejecución.
- CS8890: el tipo 'type' no está definido.
- CS8891: el tipo 'type' debe ser público para usarse como convención de llamada.
- CS8904: Varianza no válida: el parámetro de tipo debe ser válido de forma invariable en 'member' a menos que se use la versión 9.0 o posterior del lenguaje.
- CS8912: No se admite la herencia de un registro con un "Object.ToString" sellado en C# 9.0. Use la versión 10.0 o posterior del idioma.
- CS8919: el entorno de ejecución de destino no admite miembros abstractos estáticos en interfaces.
- CS8929: 'method' no puede implementar el miembro de interfaz 'member' en el tipo 'type' porque el tiempo de ejecución de destino no admite miembros abstractos estáticos en interfaces.
- CS8936: la característica no está disponible en C# 10. Use la versión 11 o posterior del idioma.
- CS8957: la expresión condicional no es válida en la versión 8.0 del lenguaje porque no se encontró un tipo común entre 'type' y 'type'. Para usar una conversión con tipo de destino, actualice a la versión de idioma 9.0 o posterior.
- CS8967: no se admiten nuevas líneas dentro de una cadena interpolada no textual en C# 10.0. Use la versión 11.0 o posterior del idioma.
- CS9014: Posible uso de la propiedad autoimplementada "name" sin asignar. Considere actualizar a la versión del lenguaje "version" para que se asigne automáticamente un valor predeterminado a la propiedad.
- CS9015: Uso del campo 'name' posiblemente no asignado. Considere actualizar a la versión del lenguaje 'version' para que se asigne automáticamente un valor predeterminado al campo.
- CS9016: Uso de la propiedad autoimplementada "name" posiblemente no asignada. Considere la posibilidad de actualizar a la versión del lenguaje "version" para asignar automáticamente un valor predeterminado a la propiedad.
- CS9017: Uso de un campo "name" posiblemente no asignado. Considere actualizar a la versión de lenguaje "version" para asignar automáticamente un valor predeterminado al campo.
- CS9041: 'type' requiere la característica del compilador 'feature', que no es compatible con esta versión del compilador de C#.
- CS9058: la característica no está disponible en C# 11. Use la versión 12 o posterior del idioma.
- CS9064: el entorno de ejecución de destino no admite campos ref.
- CS9103: "type" se define en un módulo con una versión RefSafetyRulesAttribute no reconocida, esperando "11".
- CS9171: El entorno de ejecución de destino no admite tipos de matriz en línea.
- CS9194: es posible que el argumento no se pase con la palabra clave 'ref'. Para pasar argumentos "ref" a parámetros "in", actualice a la versión 12 o posterior del idioma.
- CS9202: la característica no está disponible en C# 12.0. Use la versión 13 o posterior del idioma.
- CS9204: "type" es solo para fines de evaluación y está sujeto a cambios o eliminación en futuras actualizaciones. Suprima este diagnóstico para continuar.
- CS9211: el argumento diagnosticId para el atributo "Experimental" debe ser un identificador válido.
- CS9240: El entorno de ejecución de destino no admite genéricos de tipo ref.
- CS9260: la característica no está disponible en C# 13.0. Use la versión 14 o posterior del idioma.
- CS9268: 'type' es solo para fines de evaluación y está sujeto a cambios o eliminación en futuras actualizaciones: 'message'. Suprima este diagnóstico para continuar.
- CS9269: UnscopedRefAttribute solo es válido en C# 11 o posterior, o cuando el destino es net7.0 o posterior.
- CS9271: El tipo "Microsoft. CodeAnalysis.EmbeddedAttribute' debe ser no genérico, interno, no de archivo, sellado, no estático, tener un constructor sin parámetros, heredar de System.Attribute y poder aplicarse a cualquier tipo.
- CS9327: la característica no está disponible en C# 14.0. Use la versión de idioma "version" o superior.
- CS9328: el método 'method' usa una característica que no es compatible actualmente con el entorno de ejecución asincrónico. Opte por no participar en el método en tiempo de ejecución asincrónico al atribuirlo con "System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)".
- CS9346: la actualización requiere emitir implementación de interfaz explícita, que no es compatible con el tiempo de ejecución sin reiniciar la aplicación.
- CS9352: el entorno de ejecución de destino no admite tipos de diseño extendidos.
La causa de todos estos errores y advertencias es que el compilador o el entorno de ejecución no admiten una característica que esté usando. La resolución depende de si el problema es un problema de configuración de versión de idioma, un error de coincidencia de versiones de idioma, una limitación en tiempo de ejecución o una característica experimental.
Errores de configuración de la versión de idioma
- CS1617: opción 'option' no válida para /langversion. Use '/langversion:?' para enumerar los valores admitidos.
- CS1638: 'identifier' es un identificador reservado y no se puede usar cuando se usa el modo de versión del lenguaje ISO
- CS8192: la versión del lenguaje proporcionada no es compatible o no es válida: "value".
- CS8303: La versión del lenguaje especificada "value" no puede tener ceros iniciales
- CS8304: versión del compilador: "version". Versión del idioma: versión.
Estos errores indican que la <LangVersion> configuración del archivo del proyecto o la opción del -langversion compilador no es válida o incompatible con el compilador instalado.
Corrija el <LangVersion> valor del archivo del proyecto en una cadena de versión de lenguaje válida (CS1617, CS8192, CS8303). Los valores válidos incluyen default, latest, preview, latestMajor o un número de versión específico, como 7.3, 8.0, 9.0, 10, 11, 12, 13 o 14. No incluya ceros iniciales en el número de versión. Consulte el control de versiones del lenguaje C# para obtener la lista completa de valores admitidos.
Tip
Para ver una lista de versiones de idioma compatibles, haga referencia a la tabla de este artículo, compile con -langversion:?o establezca <LangVersion>?</LangVersion> temporalmente en el archivo de proyecto antes de compilar.
Actualice el SDK de .NET a una versión cuyo compilador admita la versión de idioma especificada (CS8304). Cada versión del compilador de C# admite versiones de lenguaje hasta un máximo específico. Si especifica una versión de lenguaje más reciente que la compatible con el compilador, actualice el SDK.
Quite los identificadores de subrayado doble o cambie la versión de idioma de ISO-1 o ISO-2 a una versión más reciente (CS1638). Los modos de lenguaje ISO reservan identificadores que contienen __ (caracteres de subrayado dobles) porque no son compatibles con la especificación ISO C#.
Note
El compilador de C# actual ya no genera CS1638. Los compiladores más antiguos emitieron este error al usar las ISO-1 versiones del lenguaje o ISO-2 .
El compilador determina su versión de lenguaje predeterminada desde la plataforma de destino:
| Objetivo | Versión | Versión predeterminada del lenguaje C# |
|---|---|---|
| .NET | 11.x | C# 15 |
| .NET | 10.x | C# 14 |
| .NET | 9.x | C# 13 |
| .NET | 8.x | C# 12 |
| .NET | 7.x | C# 11 |
| .NET | 6.x | C# 10 |
| .NET | 5.x | C# 9.0 |
| .NET Core | 3.x | C# 8.0 |
| .NET Core | 2.x | C# 7.3 |
| .NET Standard | 2.1 | C# 8.0 |
| .NET Standard | 2.0 | C# 7.3 |
| .NET Standard | 1.x | C# 7.3 |
| .NET Framework | todo | C# 7.3 |
Si quita el LangVersion elemento del archivo de proyecto, el compilador usa el valor predeterminado para la plataforma de destino. También puede especificar una versión específica para habilitar las características más recientes:
| Importancia | Significado |
|---|---|
preview |
El compilador acepta toda la sintaxis de lenguaje válida de la última versión preliminar. |
latest |
El compilador acepta la sintaxis de la versión más reciente (incluida la versión secundaria). |
latestMajoro bien default |
El compilador acepta la sintaxis de la versión principal más reciente del compilador. |
15.0 |
El compilador acepta solo la sintaxis que se incluye en C# 15 o inferior. |
14.0 |
El compilador acepta solo la sintaxis que se incluye en C# 14 o inferior. |
13.0 |
El compilador solo acepta la sintaxis que se incluye en C# 13 o versiones anteriores. |
12.0 |
El compilador solo acepta la sintaxis que se incluye en C# 12 o versiones anteriores. |
11.0 |
El compilador solo acepta la sintaxis que se incluye en C# 11 o versiones anteriores. |
10.0 |
El compilador solo acepta la sintaxis que se incluye en C# 10 o versiones anteriores. |
9.0 |
El compilador solo acepta la sintaxis que se incluye en C# 9 o versiones anteriores. |
8.0 |
El compilador acepta solo la sintaxis que se incluye en C# 8.0 o versiones anteriores. |
7.3 |
El compilador acepta solo la sintaxis que se incluye en C# 7.3 o versiones anteriores. |
7.2 |
El compilador acepta solo la sintaxis que se incluye en C# 7.2 o versiones anteriores. |
7.1 |
El compilador acepta solo la sintaxis que se incluye en C# 7.1 o versiones anteriores. |
7 |
El compilador acepta solo la sintaxis que se incluye en C# 7.0 o versiones anteriores. |
6 |
El compilador acepta solo la sintaxis que se incluye en C# 6.0 o versiones anteriores. |
5 |
El compilador acepta solo la sintaxis que se incluye en C# 5.0 o versiones anteriores. |
4 |
El compilador acepta solo la sintaxis que se incluye en C# 4.0 o versiones anteriores. |
3 |
El compilador acepta solo la sintaxis que se incluye en C# 3.0 o versiones anteriores. |
ISO-2o bien 2 |
El compilador acepta solo la sintaxis que se incluye en ISO/IEC 23270:2006 C# (2.0). |
ISO-1o bien 1 |
El compilador acepta solo la sintaxis que se incluye en ISO/IEC 23270:2003 C# (1.0/1.2). |
Para obtener más información sobre las versiones de idioma admitidas para cada versión del marco de trabajo, consulte Configuración de la versión del lenguaje en la sección de referencia del lenguaje.
Característica no disponible en la versión del lenguaje
- CS1738: las especificaciones de argumento con nombre deben aparecer después de especificar todos los argumentos fijos.
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058, CS9202, CS9260, CS9327: La característica no está disponible en C# X. Use la versión de idioma Y o superior.
- CS8306: Se deduce el nombre del elemento de la tupla. Use la versión 7.1 o superior del lenguaje para acceder a un elemento por su nombre inferido.
- CS8314: una expresión de tipo 'type' no se puede controlar mediante un patrón de tipo 'type' en la versión de C#. Use la versión de idioma "version" o superior.
- CS8371: los atributos de destino de campo en las propiedades automáticas no se admiten en la versión 7.3 del lenguaje.
- CS8401: Para usar '@$' en lugar de '$@' para una cadena textual interpolada, use la versión de idioma 8.0 o posterior.
- CS8511: Una expresión de tipo 'type' no se puede hacer coincidir con un patrón del tipo 'type'. Use la versión del lenguaje 'version' o posterior para hacer coincidir un tipo abierto con un patrón constante.
- CS8627: Debe saberse que un parámetro de tipo anulable es un tipo de valor o un tipo de referencia no anulable, a menos que se use la versión del lenguaje 'version' o posterior. Considere cambiar la versión del lenguaje o agregar una restricción 'class', 'struct' o de tipo.
- CS8630: valor 'option' no válido: 'value' para la versión de C#. Use la versión de idioma "version" o superior.
- CS8703: el modificador 'modificador' no es válido para este elemento en la versión de C#.
- CS8704: 'type' no implementa el miembro de interfaz 'member'. 'type' no puede implementar implícitamente un miembro no público.
- CS8706: El tipo no puede implementar el miembro de interfaz porque la característica no está disponible en esta versión.
- CS8904: Varianza no válida: el parámetro de tipo debe ser válido de forma invariable en 'member' a menos que se use la versión 9.0 o posterior del lenguaje.
- CS8912: No se admite la herencia de un registro con un "Object.ToString" sellado en C# 9.0.
- CS8957: la expresión condicional no es válida en la versión 8.0 del lenguaje porque no se encontró un tipo común entre tipos.
- CS8967: no se admiten nuevas líneas dentro de una cadena interpolada no textual en C# 10.0.
- CS9194: es posible que el argumento no se pase con la palabra clave 'ref'. Para pasar argumentos "ref" a parámetros "in", actualice a la versión 12 o posterior del idioma.
Estos errores indican que está usando una característica de lenguaje que requiere una versión más reciente de C# que el destino del proyecto actualmente. Para resolver estos errores, use una de las siguientes opciones:
Actualice la plataforma de destino para que el compilador seleccione automáticamente la versión de lenguaje necesaria. Cada plataforma de destino se asigna a una versión predeterminada de C#. Por ejemplo, .NET 8 usa C# 12 de forma predeterminada, .NET 9 usa C# 13 de forma predeterminada y .NET 10 usa C# 14 de forma predeterminada. Consulte la tabla en Errores de configuración de la versión de idioma para ver la correspondencia completa.
Establezca el elemento
<LangVersion>en el archivo del proyecto con la versión requerida o una superior. Por ejemplo, para habilitar las características de C# 12, agregue<LangVersion>12</LangVersion>a un elemento<PropertyGroup>en el archivo del proyecto.
Si no puede actualizar, evite la característica que desencadenó el error. El mensaje de error asigna un nombre a la característica y a la versión necesaria. En la lista siguiente se proporciona contexto adicional para errores específicos:
- Use argumentos con nombre explícito para todos los argumentos o actualice a C# 7.2 o posterior para usar argumentos con nombre no finales (CS1738).
- Acceda a los elementos de tupla por su nombre declarado en lugar del nombre inferido o actualice a C# 7.1 o posterior (CS8306).
- Use
$@"..."en lugar de@$"..."para cadenas textuales interpoladas en versiones de C# anteriores a la 8.0 (CS8401). - Agregue restricciones de tipo explícitas a parámetros de tipo que aceptan valores NULL o actualice a C# 9 o posterior, lo que relaja este requisito (CS8627).
- Actualice a C# 8.0 o una versión posterior para habilitar las anotaciones de nulabilidad y el contexto de nulabilidad (CS8630).
- Agregue conversiones explícitas en expresiones condicionales en las que las dos ramas no tienen un tipo común, o actualice a C# 9 o posterior para usar expresiones condicionales con tipo de destino (CS8957).
- Mueva nuevas líneas fuera de las expresiones de cadena interpoladas o actualice a C# 11 o posterior (CS8967).
- Use la
inpalabra clave en lugar derefcuando pase argumentos ainparámetros o actualice a C# 12 o posterior (CS9194). - Implemente miembros de interfaz no públicos explícitamente en lugar de implícitamente o actualice a C# 9 o posterior (CS8704).
El tiempo de ejecución de destino no admite la característica
- CS8021: no se encontró ningún valor para RuntimeMetadataVersion.
- CS8701: el entorno de ejecución de destino no admite la implementación predeterminada de la interfaz.
- CS8702: 'member' no puede implementar el miembro de interfaz del tipo porque el entorno de ejecución de destino no admite la implementación predeterminada de la interfaz.
- CS8707: el entorno de ejecución de destino no admite la accesibilidad "protected", "protected internal" o "private protected" para un miembro de una interfaz.
- CS8830: El entorno de ejecución de destino no admite tipos de retorno covariantes en sobrescrituras.
- CS8831: El entorno de ejecución de destino no admite tipos covariantes en sobrescrituras.
- CS8889: el entorno de ejecución de destino no admite convenciones de llamada predeterminadas extensibles o del entorno en tiempo de ejecución.
- CS8919: el entorno de ejecución de destino no admite miembros abstractos estáticos en interfaces.
- CS8929: 'method' no puede implementar el miembro de interfaz 'member' en el tipo 'type' porque el tiempo de ejecución de destino no admite miembros abstractos estáticos en interfaces.
- CS9041: 'type' requiere la característica del compilador 'feature', que no es compatible con esta versión del compilador de C#.
- CS9064: el runtime de destino no admite campos de referencia.
- CS9103: "type" se define en un módulo con una versión RefSafetyRulesAttribute no reconocida, esperando "11".
- CS9171: El tiempo de ejecución de destino no admite tipos de array en línea.
- CS9240: El entorno de ejecución de destino no admite genéricos de tipo by-ref.
- CS9328: el método 'method' usa una característica que no es compatible actualmente con el entorno de ejecución asincrónico. Opte por no participar en el método en tiempo de ejecución asincrónico al atribuirlo con "System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)".
- CS9346: la actualización requiere emitir implementación de interfaz explícita, que no es compatible con el tiempo de ejecución sin reiniciar la aplicación.
- CS9352: el entorno de ejecución de destino no admite tipos de diseño extendidos.
Estos errores difieren de los errores de versión de idioma porque la <LangVersion> actualización por sí sola no las resuelve. El tiempo de ejecución de destino (especificado por <TargetFramework>) también debe admitir la característica en el nivel clR/runtime.
Actualice el archivo <TargetFramework> del proyecto a una versión que admita la característica necesaria. En la lista siguiente se muestran las características que requieren el tiempo de ejecución mínimo:
- Implementación de interfaz predeterminada, incluido el acceso protegido (CS8701, CS8702, CS8707): requiere .NET Core 3.0/.NET 5+.
- Miembros abstractos estáticos en interfaces (CS8919, CS8929): requiere .NET 7+.
- Tipos de valor devuelto covariantes (CS8830, CS8831): Requiere .NET 5+.
- Campos ref (CS9064): requiere .NET 7+.
- Tipos de matriz en línea (CS9171): Requiere .NET 8+.
- Genéricos de tipo by-ref-like (CS9240): requiere .NET 9 o posterior.
- Tipos de diseño extendidos (CS9352): requiere .NET 10+.
- Convenciones de llamada extensibles (CS8889): requiere .NET 5+.
- Características asincrónicas en tiempo de ejecución (CS9328): requiere .NET 10+.
Actualice el SDK de .NET si el propio compilador no admite una característica de compilador necesaria (CS9041). Este error indica que una biblioteca a la que se hace referencia usa características de metadatos que requieren una versión más reciente del compilador.
Asegúrese de que existe una referencia válida a la biblioteca principal en tiempo de ejecución (CS8021). Esta advertencia suele aparecer al compilar sin una referencia estándar del entorno de ejecución. Especifique una RuntimeMetadataVersion opción o agregue una referencia a un ensamblado que contenga System.Object.
Resuelva RefSafetyRulesAttribute los errores de coincidencia de versiones mediante la recompilación de módulos dependientes con una versión del compilador compatible (CS9103).
Reinicie la aplicación si encuentra este error durante la recarga activa (CS9346). Algunos cambios de edición y continuación requieren reiniciarse porque el tiempo de ejecución no puede emitir dinámicamente las implementaciones de interfaz explícitas necesarias.
Errores de puntero a función y de convención de llamada
- CS8888: la convención de llamada "administrada" no se puede combinar con especificadores de convención de llamada no administrados.
- CS8889: el entorno de ejecución de destino no admite convenciones de llamada predeterminadas extensibles o del entorno en tiempo de ejecución.
- CS8890: el tipo 'type' no está definido.
- CS8891: el tipo 'type' debe ser público para usarse como convención de llamada.
Estos errores se relacionan con las declaraciones de puntero de función y sus especificadores de convención de llamada, introducidos en C# 9.
Quite managed de las listas de especificadores de convención de llamada que también incluyen especificadores no administrados (CS8888). La managed convención de llamada es el valor predeterminado y no se puede combinar con unmanaged especificadores como Cdecl, Stdcall, Thiscallo Fastcall.
Actualice la plataforma de destino a .NET 5 o posterior para usar convenciones de llamada extensibles o predeterminadas en tiempo de ejecución (CS8889). El atributo UnmanagedCallersOnly y los tipos de convención de llamada extensible requieren compatibilidad en tiempo de ejecución que no está disponible en .NET Core 3.1 o anteriores.
Asegúrese de que el tipo de convención de llamada existe en los ensamblados a los que se hace referencia (CS8890). Los tipos de convención de llamada como CallConvCdecl, CallConvStdcall, CallConvThiscally CallConvFastcall se definen en System.Runtime.CompilerServices. Si no se encuentra el tipo, añada una referencia a la biblioteca en tiempo de ejecución correcta.
Realice tipos public de convención de llamada personalizados (CS8891). Si define un tipo de convención de llamada personalizada, declárelo como public para usarlo en una declaración de tipo de puntero de función.
Características experimentales y en versión preliminar
- CS8058: la característica "feature" es experimental y no es compatible; use "/features:feature" para habilitar.
- CS8305: 'type' es solo para fines de evaluación y está sujeto a cambios o eliminación en futuras actualizaciones.
- CS8652: la característica se encuentra actualmente en versión preliminar y no es compatible. Para usar las características en versión preliminar, use la versión del lenguaje "preview".
- CS9204: "type" es solo para fines de evaluación y está sujeto a cambios o eliminación en futuras actualizaciones. Suprima este diagnóstico para continuar.
- CS9211: el argumento diagnosticId para el atributo "Experimental" debe ser un identificador válido.
- CS9268: 'type' es solo para fines de evaluación y está sujeto a cambios o eliminación en futuras actualizaciones: 'message'. Suprima este diagnóstico para continuar.
Estos diagnósticos indican que está usando una característica o un tipo marcados como experimentales o que solo están disponibles en la versión preliminar del lenguaje.
Advertencia
Las características experimentales están sujetas a cambios. Es posible que las API cambien o que se quiten en futuras actualizaciones. Incluir características experimentales es una manera de que los autores de bibliotecas obtengan comentarios sobre ideas y conceptos para el desarrollo futuro. Tenga precaución extrema al usar cualquier característica marcada como experimental.
Establezca <LangVersion>preview</LangVersion> en el archivo de proyecto para usar las características del lenguaje de vista previa (CS8652). Las características en versión preliminar aún no se han finalizado y podrían cambiar en futuras versiones.
Suprima el identificador de diagnóstico específico para reconocer la naturaleza experimental de la API (CS8058, CS8305, CS9204, CS9268). Los autores de bibliotecas marcan las API con System.Diagnostics.CodeAnalysis.ExperimentalAttribute para indicar que están sujetas a cambios. Puede suprimir el diagnóstico mediante #pragma warning disable o agregando el identificador de diagnóstico a <NoWarn> en el archivo del proyecto.
Asegúrese de que el diagnosticId argumento para [Experimental] es un identificador de C# válido (CS9211). El identificador debe seguir las reglas de nomenclatura estándar. No puede contener espacios, caracteres especiales ni empezar con un dígito. También puede declarar sus propias características experimentales mediante .System.Diagnostics.CodeAnalysis.ExperimentalAttribute
Cambios disruptivos en la inicialización de estructuras
- CS0171, CS8881: El campo 'name' debe asignarse completamente antes de que se devuelva el control al autor de la llamada. Considere la posibilidad de actualizar a la versión de idioma "version" para que el campo sea el predeterminado automático.
- CS0188, CS8885: No se puede usar el objeto 'this' antes de que se hayan asignado todos sus campos. Considere la posibilidad de actualizar a la versión de idioma "version" para establecer automáticamente los campos sin asignar.
- CS0843, CS8880: La propiedad "name" implementada automáticamente debe asignarse completamente antes de que se devuelva el control al autor de la llamada. Considere la posibilidad de actualizar a la versión de idioma "version" para que la propiedad sea predeterminada automáticamente.
- CS9014: Uso de la propiedad autoimplementada "name" posiblemente no asignada. Considere actualizar a la versión de idioma "version" para asignar automáticamente un valor predeterminado a la propiedad.
- CS9015: Uso del campo "name" posiblemente no asignado. Considere actualizar a la versión del lenguaje "version" para asignar automáticamente un valor predeterminado al campo.
- CS9016: Uso de la propiedad implementada automáticamente "name", posiblemente sin asignar. Considere actualizar a la versión del lenguaje "version" para que se asigne automáticamente un valor predeterminado a la propiedad.
- CS9017: Uso del campo "name" que posiblemente no se ha asignado. Considere actualizar a la versión de idioma "version" para que se asigne automáticamente un valor predeterminado al campo.
Estos errores y advertencias ayudan a garantizar que los tipos struct se inicializan correctamente antes de acceder a sus campos. En versiones anteriores de C#, debe asignar explícitamente todos los campos de una estructura en cualquier constructor. El constructor sin parámetros inicializa todos los campos en su valor predeterminado. En versiones posteriores, todos los constructores inicializan todos los campos. El campo se establece explícitamente, se establece en un inicializador de campo o se establece en su valor predeterminado.
Actualice a C# 11 o a una versión posterior para que todos los constructores struct asignen automáticamente valores predeterminados a todos los campos (CS0171, CS0188, CS0843, y sus equivalentes más recientes CS8880, CS8881, CS8885). A partir de C# 11, el compilador inicializa automáticamente los campos que no se establecen explícitamente en un constructor en sus valores predeterminados.
Llame explícitamente al constructor predeterminado mediante : this() en el constructor de estructura si no puede actualizar a C# 11 (CS0171, CS0188, CS0843). Este enfoque garantiza que todos los campos reciban sus valores predeterminados antes de que se ejecute el cuerpo del constructor:
struct S
{
public int AIProp { get; set; }
public S(int i) : this() // Ensures all fields are initialized
{
AIProp = i;
}
}
Asigne todos los campos y propiedades automáticas antes de usar this o antes de que el constructor devuelva (CS9014, CS9015, CS9016, CS9017). Estos diagnósticos aparecen cuando un compilador más reciente detecta que podría leer una propiedad o un campo antes de que se haya asignado. Asigne explícitamente un valor o actualice a una versión en la que la asignación automática de un valor predeterminado elimine la advertencia.
Atributos específicos de la implementación
- CS9269: UnscopedRefAttribute solo es válido en C# 11 o posterior, o cuando el destino es net7.0 o posterior.
- CS9271: El tipo 'Microsoft.CodeAnalysis.EmbeddedAttribute' debe ser no genérico, interno, no de archivo, sellado, no estático, tener un constructor sin parámetros, heredar de System.Attribute y poder aplicarse a cualquier tipo.
Estos errores se relacionan con atributos generados por el compilador o vinculados a versiones en tiempo de ejecución específicas.
Actualice a C# 11 y .NET 7 o posterior para usar UnscopedRefAttribute (CS9269). Este atributo indica que un ref valor de retorno o un ref struct parámetro no tiene asociado un tiempo de vida de ámbito. Requiere tanto la versión del lenguaje como el marco de destino para cumplir los requisitos mínimos.
No declare manualmente Microsoft.CodeAnalysis.EmbeddedAttribute (CS9271). El compilador genera automáticamente el origen de este atributo cuando sea necesario. Si tiene un tipo declarado manualmente con este nombre, quítelo o cámbielo para evitar conflictos con la versión generada por el compilador.