Chyba kompilátoru CS0677

Proměnná: Nestálé pole nemůže být typu type 'type'

Pole deklarovaná pomocí klíčového volatile slova musí být jedním z následujících typů:

  • Libovolný typ odkazu.

  • Libovolný typ ukazatele (v unsafe kontextu).

  • Typy sbyte, , byte, short, ushortint, floatuintchar, . bool

  • Výčtové typy založené na některém z uvedených typů.

Následující ukázka vygeneruje CS0677:

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

Možná alternativní řešení

V některých scénářích můžete místo alternativního řešení pro CS0677 použít nint celé číslo s nativní velikostí long . Typ nint je zaručen pro podporu atomového přístupu a dá se použít s klíčovým slovem volatile :

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

Typ nint je celé číslo v nativní velikosti, které je 32bitové na 32bitových platformách a 64bitové na 64bitových platformách. Na 64bitových platformách má stejnou velikost a rozsah jako long, ale je navržený tak, nint aby zajistil atomický přístup. Toto alternativní řešení je nejvhodnější v těchto případech:

  • Váš kód cílí na 64bitové platformy, kde nint poskytuje stejný rozsah jako long.
  • Potřebujete atomický přístup k velké celočíselné hodnotě ve vícevláknovém kontextu.
  • Pro váš případ použití je přijatelné chování celočíselné velikosti specifické pro platformu.

Další informace o celočíselných číslech nativní velikosti naleznete v tématu Integrální číselné typy.

Jako obecné pokyny k programování bezpečnému pro přístup z více vláken zvažte použití Interlocked operací nebo lock příkazu místo volatile polí.