Errore del compilatore CS0677

'variable': un campo volatile non può essere di tipo 'type'

I campi dichiarati con la volatile parola chiave devono essere uno dei tipi seguenti:

  • Qualsiasi tipo di riferimento.

  • Qualsiasi tipo di puntatore (in un unsafe contesto).

  • sbyteTipi , byte, shortushort, int, uint, char, , float, . bool

  • Tipi di enumerazione basati su uno dei tipi elencati.

L'esempio seguente genera l'errore CS0677:

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

Possibili soluzioni alternative

In alcuni scenari potrebbe essere possibile usare nint (intero con dimensioni native) anziché long come soluzione alternativa per CS0677. Il nint tipo supporta l'accesso atomico e può essere usato con la volatile parola chiave :

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

Il nint tipo è un numero intero di dimensioni native a 32 bit su piattaforme a 32 bit e a 64 bit su piattaforme a 64 bit. Nelle piattaforme a 64 bit, nint ha le stesse dimensioni e intervallo di long, ma è progettato per garantire l'accesso atomico. Questa soluzione alternativa è più appropriata quando:

  • Il codice è destinato a piattaforme a 64 bit in cui nint viene fornito lo stesso intervallo di long.
  • È necessario l'accesso atomico a un valore intero di grandi dimensioni in un contesto multithreading.
  • Il comportamento delle dimensioni integer specifiche della piattaforma è accettabile per il caso d'uso.

Per altre informazioni sui numeri interi di dimensioni native, vedere Tipi numerici integrali.

Come materiale sussidiario generale sulla programmazione thread-safe, prendere in considerazione l'uso Interlocked di operazioni o l'istruzione lock anziché i volatile campi.