Erro do compilador CS0677

'variable': um campo volátil não pode ser do tipo 'type'

Os campos declarados com a volatile palavra-chave devem ser um dos seguintes tipos:

  • Qualquer tipo de referência.

  • Qualquer tipo de ponteiro (em um unsafe contexto).

  • Os tipos sbyte, byte, short, , ushort, int, uint, char, float, . bool

  • Enumerar tipos com base em qualquer um dos tipos listados.

O exemplo a seguir gera CS0677:

// CS0677.cs  
class TestClass  
{  
   private volatile long i;   // CS0677  
  
   public static void Main()  
   {  
   }  
}  

Possíveis soluções alternativas

Em alguns cenários, você pode ser capaz de usar nint (inteiro de tamanho nativo) em vez de long como uma solução alternativa para CS0677. O nint tipo é garantido para dar suporte ao acesso atômico e pode ser usado com a volatile palavra-chave:

class TestClass  
{  
   private volatile nint i;   // This compiles successfully
  
   public static void Main()  
   {  
   }  
}  

O nint tipo é um inteiro de tamanho nativo que tem 32 bits em plataformas de 32 bits e 64 bits em plataformas de 64 bits. Em plataformas de 64 bits, nint tem o mesmo tamanho e intervalo longque, mas foi projetado para garantir o acesso atômico. Essa solução alternativa é mais apropriada quando:

  • Seu código tem como destino plataformas de 64 bits em que nint fornece o mesmo intervalo que long.
  • Você precisa de acesso atômico a um grande valor inteiro em um contexto multithreaded.
  • O comportamento de tamanho inteiro específico da plataforma é aceitável para seu caso de uso.

Para obter mais informações sobre inteiros de tamanho nativo, consulte tipos numéricos integrais.

Como orientação geral sobre programação thread-safe, considere o uso Interlocked de operações ou a lock instrução em vez de volatile campos.