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.
Resolución de advertencias relacionadas con las
En este artículo se tratan los siguientes errores del compilador:
-
CS0245: Los destructores y
object.Finalizeno pueden ser llamados directamente. Considere la posibilidad de llamar aIDisposable.Disposesi están disponibles. -
CS0728: Posiblemente una asignación incorrecta a la variable local que es el argumento de una instrucción using o de una instrucción
lock. La llamadaDisposeo desbloqueo se producirá en el valor original de la variable local. -
CS1674: el tipo usado en una instrucción using debe convertirse implícitamente en "
System.IDisposable". -
CS8410: 'El tipo usado en una instrucción asincrónica
usingdebe convertirse implícitamente en 'System.IAsyncDisposable' o implementar un método 'DisposeAsync' adecuado. -
CS8417: el tipo usado en una instrucción using asincrónica debe implementar "
System.IAsyncDisposable" o implementar un método "DisposeAsync" adecuado. ¿Quieres decir 'using' en lugar de 'await using'? -
CS8418: El tipo usado en una instrucción using debe implementar "
System.IDisposable". ¿Quiere decir "await using" en lugar de "using"? - CS8647: una variable using no se puede usar directamente dentro de una sección switch (considere la posibilidad de usar llaves).
-
CS8648: no
gotose puede saltar a una ubicación después de una declaración using. - CS8649: no se puede saltar a una ubicación anterior a una declaración using dentro del mismo bloque.
- CS9229: No se pueden colocar modificadores en las declaraciones using.
Implementación de IDisposable e IAsyncDisposable
Los siguientes errores y advertencias del compilador indican problemas con la implementación o el uso del patrón dispose:
-
CS0245: Los destructores y
object.Finalizeno se pueden llamar directamente. Considere llamarIDisposable.Disposesi está disponible. -
CS1674: El tipo usado en una declaración using debe ser implícitamente convertible a "
System.IDisposable". -
CS8410: el tipo usado en una instrucción asincrónica
usingdebe convertirse implícitamente en "System.IAsyncDisposable" o implementar un método "DisposeAsync" adecuado. -
CS8417: El tipo usado en una instrucción asincrónica
usingdebe implementar "System.IAsyncDisposable" o implementar un método 'DisposeAsync' adecuado. ¿Quieres decir 'using' en lugar de 'await using'? -
CS8418: El tipo utilizado en una declaración using debe implementar "
System.IDisposable". ¿Quiso decir 'await using' en lugar de 'using'?
La instrucción using garantiza la eliminación adecuada de los recursos al final del using bloque. Para usar un tipo con una instrucción using, debe implementar la interfaz de eliminación adecuada. Para instrucciones sincrónicas using , el tipo debe implementar IDisposable. Para instrucciones asincrónicas await using , el tipo debe implementar IAsyncDisposable.
-
No se puede llamar a Finalize directamente (CS0245): no se puede llamar directamente a un destructor ni al Object.Finalize método . El recolector de basura invoca automáticamente los finalizadores cuando ya no se hace referencia a los objetos. Para la limpieza determinista, implemente IDisposable y llame al
Disposemétodo en su lugar. -
El tipo debe implementar IDisposable (CS1674): solo los tipos que implementan IDisposable se pueden usar en una
usinginstrucción . Los tipos de valor no implementan esta interfaz, y no se puede asumir que los parámetros de tipo genérico sin restricciones adecuadas sean descartables. Aplique una restricción de tipo comowhere T : IDisposablecuando trabaje con tipos genéricos. -
El tipo debe implementar IAsyncDisposable (CS8410): los tipos utilizados con
await usingdeben implementar IAsyncDisposable o proporcionar un métodoDisposeAsyncadecuado. Si el tipo no admite la eliminación asincrónica, use una instrucción sincrónicausingen su lugar o implemente la interfaz necesaria. -
Patrón de eliminación no coincidente (CS8417, CS8418): CS8417 se produce cuando se usa
await usingcon un tipo que solo implementa IDisposable. CS8418 se produce cuando se utiliza sincrónicousingcon un tipo que solo implementa IAsyncDisposable. Haga coincidir lausingpalabra clave con la interfaz que implementa el tipo o implemente ambas interfaces si necesita admitir ambos patrones.
Para obtener más información, vea Finalizadores, Implementación de un método Dispose e Implementación de un método DisposeAsync.
Uso del ámbito de las variables y el flujo de control
Los siguientes errores y advertencias del compilador se relacionan con el uso incorrecto de variables dentro de las instrucciones de flujo de using control:
-
CS0728: Posible asignación incorrecta a la variable local, que es el argumento de una instrucción
usingolock. La llamadaDisposeo desbloqueo se producirá en el valor original de la variable local. - CS8647: Una variable de 'using' no se puede usar directamente dentro de una sección 'switch' (considere usar llaves).
- CS8648: no puede saltar a una ubicación después de una declaración de uso.
-
CS8649:
gotono es posible saltar a una ubicación antes de una declaración de 'using' dentro del mismo bloque.
Las variables declaradas con using tienen reglas de ámbito específicas que impiden pérdidas de recursos. El compilador aplica estas reglas para garantizar la eliminación adecuada.
Asignación al uso de la variable (CS0728): esta advertencia señala que asignó un nuevo valor a una variable que es un recurso en una
usinginstrucción. La llamada dispose se produce en el valor original, no en el valor recién asignado, lo que puede provocar pérdidas de recursos. Inicializa el recurso en la sentenciausingen lugar de asignarlo más adelante.Uso de la variable en la sección switch (CS8647): una
usingdeclaración crea una variable que se elimina al final de su ámbito. Cuando se usa directamente en una sección de switch sin llaves, el alcance es ambiguo y puede provocar errores. Envuelva el contenido de la sección switch entre corchetes para definir claramente el ámbito.Instrucciones Goto y declaraciones de uso (CS8648, CS8649): no se pueden usar
gotoinstrucciones para saltarusingdeclaraciones porque el salto omitiría la correcta gestión de recursos. CS8648 se produce al saltar hacia delante sobre unausingdeclaración y CS8649 se produce al saltar hacia atrás a una ubicación antes de unausingdeclaración. Reestructura tu código para usar un flujo de control estructurado, como los bucles, o la declaraciónusingmuévala fuera del destino de salto.
Para obtener más información, consulte using statement.
Declaración incorrecta using
- CS9229: los modificadores no se pueden colocar en las declaraciones using.
Una declaración de variable envuelta en una using no puede contener los siguientes modificadores:
conststaticvolatilereadonly- Modificadores de accesibilidad:
public,protected,internal,private, oprotected internalprivate protected
El siguiente ejemplo genera la advertencia CS9229:
using System;
class Program
{
static void Main()
{
// error CS9229: Modifiers cannot be placed on using declarations.
public using var resource = new Resource();
// error CS9229: Modifiers cannot be placed on using declarations.
static using var anotherResource = new Resource();
}
}
class Resource : IDisposable
{
public void Dispose() { }
}
Para corregir este error, quite el modificador de la using declaración:
using var resource = new Resource();
Para obtener más información, consulte using statement.