Erro do Compilador CS1674

'T': tipo usado em uma instrução using deve ser implicitamente conversível para 'System.IDisposable'

A instrução using destina-se a ser usada para garantir o descarte de um objeto ao final do bloco using, portanto, somente os tipos que são descartáveis podem ser usados nesse tipo de instrução. Por exemplo, tipos de valor não são descartáveis e parâmetros de tipo que não são restritos a serem classes podem não ser considerados descartáveis.

Exemplo 1

O exemplo a seguir gera o erro CS1674.

// CS1674.cs  
class C  
{  
   public static void Main()  
   {  
      int a = 0;  
      a++;  
  
      using (a) {}   // CS1674  
   }  
}  

Exemplo 2

O exemplo a seguir gera o erro CS1674.

// CS1674_b.cs  
using System;  
class C {  
   public void Test() {  
      using (C c = new C()) {}   // CS1674  
   }  
}  
  
// OK  
class D : IDisposable {  
   void IDisposable.Dispose() {}  
   public void Dispose() {}  
  
   public static void Main() {  
      using (D d = new D()) {}  
   }  
}  

Exemplo 3

O caso a seguir ilustra a necessidade de uma restrição de tipo de classe para assegurar que um parâmetro de tipo desconhecido é descartável. O exemplo a seguir gera o erro CS1674.

// CS1674_c.cs  
// compile with: /target:library  
using System;  
public class C<T>  
// Add a class type constraint that specifies a disposable class.  
// Uncomment the following line to resolve.  
// public class C<T> where T : IDisposable  
{  
   public void F(T t)  
   {  
      using (t) {}   // CS1674  
   }  
}