Compartir vía


Resolución de advertencias relacionadas con las versiones y características del lenguaje

En este artículo se tratan las siguientes advertencias del compilador:

  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: La característica no está disponible. Use la versión de lenguaje más reciente.
  • CS8058: la característica es experimental.
  • CS8192: la versión de lenguaje proporcionada no es compatible o válida
  • CS8303: la versión del lenguaje proporcionada no puede tener ceros iniciales
  • CS8304: la versión del compilador es menor que la versión del lenguaje
  • CS1738: las especificaciones de argumento con nombre deben aparecer después de especificar todos los argumentos fijos.
  • CS8306: se deduce el nombre del elemento tupla.
  • CS8314: no se puede controlar una expresión de tipo mediante un patrón de tipo
  • CS8371: los atributos de destino de campo en las propiedades automáticas no se admiten en la versión del lenguaje
  • CS8401: para usar @$ en lugar de $@ para una cadena textual interpolada, use la versión más reciente del lenguaje.
  • CS8511: un patrón de tipo no puede controlar una expresión de tipo.
  • CS8627: un parámetro de tipo que acepta valores NULL debe conocerse como un tipo de valor o un tipo de referencia que no acepta valores NULL
  • CS8630: opciones que aceptan valores NULL no válidas. Use la versión de lenguaje más reciente
  • CS8652: el modificador no es válido para este elemento.
  • CS8704: el tipo no implementa el miembro de interfaz. No puede implementar implícitamente un miembro no público.
  • CS8706: el tipo no puede implementar un miembro de interfaz porque una característica no está disponible en esta versión.
  • CS8904: varianza no válida: el parámetro de tipo debe ser válido.
  • CS8912: no se admite heredar de un registro con un "Object.ToString" sellado.
  • CS8919: no se puede implementar el miembro de interfaz especificado en el tipo porque el tiempo de ejecución de destino no admite miembros abstractos estáticos en interfaces
  • CS8929: el método no puede implementar el miembro de interfaz en el tipo porque el tiempo de ejecución de destino no admite miembros abstractos estáticos en interfaces.
  • CS8957: la expresión condicional no es válida en la versión 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#
  • CS9014: Error: uso de la propiedad posiblemente sin asignar. Actualice al valor predeterminado automático de la propiedad.
  • CS9015: Error: uso del campo posiblemente sin asignar. Actualice al valor predeterminado automático del campo.
  • CS9016: Advertencia: uso de la propiedad posiblemente sin asignar. Actualice al valor predeterminado automático de la propiedad.
  • CS9017: Advertencia: uso del campo posiblemente sin asignar. Actualice al valor predeterminado automático del campo.
  • CS9064: el runtime de destino no admite campos de referencia.
  • CS9103: definición en un módulo con una versión RefSafetyRulesAttribute no reconocida, esperando "11".
  • CS9171: el runtime de destino no admite tipos de matriz insertados.
  • CS9194: es posible que no se pase el argumento con la palabra clave ref. Para pasar argumentos ref a parámetros in, actualice a la versión de idioma 12 o posterior.
  • CS9202: la característica no está disponible en C# 12.0. Use la versión de lenguaje más reciente
  • 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 by-ref.
  • CS9260: la característica no está disponible en C# 13.0. Use la versión de idioma más reciente.*

Además, los siguientes errores y advertencias guardan relación con los cambios de inicialización de la estructura en versiones recientes:

  • CS0171, CS8881: El campo de copia de seguridad de la propiedad implementada automáticamente "name" se debe asignar por completo antes de devolver el control al autor de la llamada.
  • CS0188, CS8885: El objeto "this" no se puede usar antes de que se hayan asignado todos sus campos.
  • CS0843, CS8880: El campo de copia de seguridad de la propiedad implementada automáticamente "name" se debe asignar por completo antes de devolver el control al autor de la llamada.
  • CS8305: la característica es solo para fines de evaluación y está sujeta a cambios o eliminación en futuras actualizaciones.
  • CS9204: el tipo es solo para fines de evaluación y está sujeto a cambios o eliminación en futuras actualizaciones. Suprima este diagnóstico para continuar.

La causa de todos estos errores y advertencias es que el compilador instalado admite una versión más reciente de C# que la versión que ha seleccionado el proyecto. El compilador de C# puede ajustarse a cualquier versión anterior. Puede validar la sintaxis con una versión anterior de C#, o porque el proyecto debe admitir bibliotecas o entornos de ejecución más antiguos.

Hay dos causas posibles y tres maneras de solucionar estos errores y advertencias.

Actualización de la plataforma de destino

El compilador determina un valor predeterminado según estas reglas:

Destino Versión Versión predeterminada del lenguaje C#
.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 la plataforma seleccionada no coincide con la versión de lenguaje necesaria, puede actualizar la plataforma de destino.

Selección de la versión de lenguaje coincidente

Es posible que tenga una plataforma de destino anterior seleccionada en el archivo del proyecto. Si quita el elemento LangVersion del archivo de proyecto, el compilador usa el valor predeterminado que se muestra en la sección anterior. En la siguiente tabla se muestran las versiones actuales del lenguaje C#. También puede especificar una versión de lenguaje específica para habilitar las características más recientes.

Value 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 última versión del compilador (incluida las versión secundaria).
latestMajor
o bien default
El compilador acepta la sintaxis de la versión principal más reciente del compilador.
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-2
o bien 2
El compilador acepta solo la sintaxis que se incluye en ISO/IEC 23270:2006 C# (2.0).
ISO-1
o bien 1
El compilador acepta solo la sintaxis que se incluye en ISO/IEC 23270:2003 C# (1.0/1.2).

Puede obtener más información sobre las versiones de lenguaje admitidas para cada versión de plataforma en el artículo Configuración de la versión de lenguaje en la sección de referencia del lenguaje.

Evitación de la características actualizadas

Si debe admitir bibliotecas o entornos de ejecución anteriores, es posible que tenga que evitar el uso de características más recientes.

Habilitar características experimentales

Los diagnósticos de las características experimentales se pueden deshabilitar para usar la característica experimental.

Advertencia

Las características experimentales están sujetas a cambios. Las API pueden cambiar o se pueden quitar 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.

También puede declarar sus propias características experimentales mediante System.Diagnostics.CodeAnalysis.ExperimentalAttribute. El compilador emite CS9211 si el identificador usado para la característica experimental no es un identificador válido.

Cambios importantes en la inicialización de estructuras

Todos estos errores y advertencias ayudan a garantizar que los tipos struct se inicializan correctamente antes de que se acceda 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.

  • CS0171, CS8881: El campo de copia de seguridad de la propiedad implementada automáticamente "name" se debe asignar por completo antes de devolver el control al autor de la llamada.
  • CS0188, CS8885: El objeto "this" no se puede usar antes de que se hayan asignado todos sus campos.
  • CS0843, CS8880: El campo de copia de seguridad de la propiedad implementada automáticamente "name" se debe asignar por completo antes de devolver el control al autor de la llamada.

Para solucionar este error, actualice la versión del lenguaje a C# 11, cada constructor struct inicializa todos los campos. Si no es una opción posible, debe llamar explícitamente al constructor predeterminado, como se muestra en el ejemplo siguiente:

struct S
{
    public int AIProp { get; set; }
    public S(int i){} //CS0843
    // Try the following lines instead.
    // public S(int i) : this()
    // {
    //     AIProp = i;
    // }
}

class Test
{
    static int Main()
    {
        return 1;
    }
}