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.
El compilador de C# genera errores y advertencias cuando se declaran expresiones de interpolación de cadenas o controladores de interpolación de cadenas con sintaxis incorrecta o se usan en contextos no admitidos. Estos diagnósticos le ayudan a identificar problemas con interpolaciones de cadenas o controladores de interpolación de cadenas personalizados.
- CS8361: no se puede usar una expresión condicional directamente en una interpolación de cadenas porque ":" finaliza la interpolación. Entre paréntesis la expresión condicional.
- CS8941: el método del controlador de cadenas interpoladas tiene un formato incorrecto. No devuelve 'void' ni 'bool'.
- CS8942: el método del controlador de cadenas interpoladas tiene un tipo de valor devuelto incoherente. Se espera que devuelva un tipo diferente.
- CS8946: El tipo no es un tipo de controlador de cadena interpolado.
- CS8947: el parámetro se produce después del parámetro del controlador de cadenas interpolado en la lista de parámetros, pero se usa como argumento para las conversiones del controlador de cadenas interpoladas. Esto requerirá que el autor de la llamada reordene los parámetros con argumentos con nombre en el sitio de llamada. Considere la posibilidad de colocar el parámetro del controlador de cadenas interpolado después de todos los argumentos implicados.
- CS8953: El controlador de cadenas interpolado no puede usar dynamic. Construya manualmente una instancia en su lugar.
- CS8976: las conversiones de controlador de cadenas interpoladas que hacen referencia a la instancia que se indexa no se pueden usar en inicializadores de miembros del indexador.
- CS9205: cadena interpolada esperada.
- CS9325: no se permiten argumentos de controlador de cadenas interpoladas en este contexto.
Sintaxis de expresión de interpolación
- CS8361 - No se puede usar una expresión condicional directamente en una interpolación de cadenas porque ":" finaliza la interpolación. Entre paréntesis la expresión condicional.
- CS9205 - Cadena interpolada esperada.
Para corregir estos errores, aplique las técnicas siguientes:
- Encapsular expresiones condicionales (operador ternario
?:) entre paréntesis cuando se usan dentro de un agujero de interpolación (CS8361). El carácter de dos puntos tiene un significado especial en las cadenas interpoladas, ya que introduce una cadena de formato, por lo que el compilador interpreta el:encondition ? true : falsecomo un especificador de formato en lugar de formar parte de la expresión condicional. Por ejemplo, usa$"{(x > 0 ? "positive" : "negative")}"en lugar de$"{x > 0 ? "positive" : "negative"}". - Asegúrese de proporcionar un literal de cadena interpolado donde se espera uno (CS9205). Este error se produce cuando el compilador espera una cadena interpolada (a partir
$"de o$@"), pero encuentra un tipo de expresión diferente.
Implementación del tipo de controlador de cadenas interpoladas
- CS8941 - El método de controlador de cadenas interpoladas tiene un formato incorrecto. No devuelve 'void' ni 'bool'.
- CS8942 - El método de controlador de cadenas interpoladas tiene un tipo de valor devuelto incoherente. Se espera que devuelva un tipo diferente.
- CS8946 - El tipo no es un tipo de controlador de cadenas interpolado.
Al implementar un controlador de cadenas interpolado personalizado, aplique las siguientes técnicas:
- Asegúrese de que todos los
AppendLiteralmétodos yAppendFormatteddevuelvenvoidobool(CS8941). El patrón de controlador requiere que estos métodos tengan uno de estos tipos devueltos para que el compilador pueda generar correctamente el código de interpolación. Los métodos que devuelvenboolhabilitan el cortocircuito cuando el controlador determina que no se necesita procesamiento adicional. - Asegúrese de que todos los métodos append del tipo de controlador usen el mismo tipo de valor devuelto (CS8942). Si un método devuelve
void, todos los métodos append deben devolvervoid. Si uno devuelvebool, todos deben devolverbool. La combinación de tipos devueltos impide que el compilador genere código de interpolación coherente. - Aplique el tipo de controlador InterpolatedStringHandlerAttribute y verifique que tenga un constructor válido (CS8946). Un tipo de controlador de cadena interpolado debe marcarse con este atributo y seguir el patrón de controlador que el compilador reconocerá.
Restricciones de uso del controlador de cadenas interpoladas
- CS8947 - El parámetro se produce después del parámetro del controlador de cadenas interpolado en la lista de parámetros, pero se usa como argumento para las conversiones del controlador de cadenas interpoladas. Esto requerirá que el autor de la llamada reordene los parámetros con argumentos con nombre en el sitio de llamada. Considere la posibilidad de colocar el parámetro del controlador de cadenas interpolado después de todos los argumentos implicados.
- CS8953 - Una construcción de controlador de cadenas interpoladas no puede usar dinámicamente. Construya manualmente una instancia de "{0}".
- CS8976 - Las conversiones de controlador de cadenas interpoladas que hacen referencia a la instancia que se indexa no se pueden usar en inicializadores de miembros del indexador.
- CS9325 - No se permiten argumentos de controlador de cadenas interpoladas en este contexto.
Al usar controladores de cadenas interpoladas, aplique las técnicas siguientes:
- Reordene los parámetros del método para que los parámetros utilizados por InterpolatedStringHandlerArgumentAttribute el aparezcan antes del parámetro del controlador de cadenas interpolado (CS8947). Esta advertencia indica que los autores de llamadas necesitarían usar argumentos con nombre para invocar correctamente el método, lo que reduce la facilidad de uso. Coloque el parámetro del controlador después de todos los argumentos de los que depende.
- No utilice valores tipados
dynamiccomo argumentos para las conversiones de manejadores de cadenas interpoladas (CS8953). El compilador no puede determinar los requisitos de construcción del controlador en tiempo de compilación cuando intervienen valores dinámicos. En su lugar, construya manualmente la instancia del controlador y llame directamente a sus métodos. - No use cadenas interpoladas que hagan referencia a la instancia que se inicializa en inicializadores de miembro del indexador (CS8976). Durante la inicialización de objetos, la instancia no está completamente construida, por lo que no se permiten conversiones de controlador que hacen referencia a ella a través de
this. Use una instrucción independiente después de la inicialización para establecer el valor del indexador. - Compruebe el contexto en el que usa argumentos del controlador de cadenas interpoladas (CS9325). Algunos contextos no admiten atributos de argumento de controlador. En estos casos, use una cadena interpolada normal o construya manualmente el controlador.