Błąd kompilatora CS0677

"zmienna": pole volatile nie może być typu "type"

Pola zadeklarowane za pomocą volatile słowa kluczowego muszą być jednym z następujących typów:

  • Dowolny typ odwołania.

  • Dowolny typ wskaźnika (w unsafe kontekście).

  • Typy sbyte, , byte, shortuintintcharushort, , . boolfloat

  • Typy wyliczeniowe na podstawie dowolnego z wymienionych typów.

Poniższy przykład generuje CS0677:

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

Potencjalne obejścia

W niektórych scenariuszach można użyć nint (liczby całkowitej o rozmiarze natywnym) zamiast long jako obejścia dla CS0677. Typ nint jest gwarantowany do obsługi dostępu niepodzielnego i może być używany ze volatile słowem kluczowym:

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

Typ nint jest liczbą całkowitą o wielkości natywnej, która jest 32-bitowa na platformach 32-bitowych i 64-bitowych na platformach 64-bitowych. Na 64-bitowych platformach nint ma taki sam rozmiar i zakres jak long, ale jest przeznaczony do zagwarantowania dostępu niepodzielnego. To obejście jest najbardziej odpowiednie w następujących przypadkach:

  • Kod jest przeznaczony dla platform 64-bitowych, gdzie nint zapewnia ten sam zakres co long.
  • Potrzebujesz niepodzielnego dostępu do dużej wartości całkowitej w kontekście wielowątkowym.
  • Zachowanie rozmiaru liczby całkowitej specyficznej dla platformy jest akceptowalne dla twojego przypadku użycia.

Aby uzyskać więcej informacji na temat liczb całkowitych o rozmiarze natywnym, zobacz Typy liczb całkowitych.

Ogólne wskazówki dotyczące programowania bezpiecznego wątkowo należy rozważyć użycie Interlocked operacji lub instrukcji lockvolatile zamiast pól.