Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
"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
unsafekontekście).Typy
sbyte, ,byte,shortuintintcharushort, , .boolfloatTypy 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
nintzapewnia ten sam zakres colong. - 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.