コンパイラ エラー CS0677

'variable': 揮発性フィールドを型 'type' にすることはできません

volatile キーワードで宣言されるフィールドは、次のいずれかの型である必要があります。

  • 任意の参照型。

  • 任意のポインター型 ( unsafe コンテキスト内)。

  • sbytebyteshortushortintuintcharfloatbool

  • 列挙された型のいずれかに基づく列挙型。

次の例では CS0677 が生成されます。

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

考えられる回避策

シナリオによっては、CS0677 の回避策としてlongではなく、nint (ネイティブ サイズの整数) を使用できる場合があります。 nint型はアトミック アクセスをサポートすることが保証されており、volatile キーワードと共に使用できます。

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

nint型は、32 ビット プラットフォームでは 32 ビット、64 ビット プラットフォームでは 64 ビットのネイティブ サイズの整数です。 64 ビット プラットフォームでは、 nint のサイズと範囲は longと同じですが、アトミック アクセスを保証するように設計されています。 この回避策は、次の場合に最も適しています。

  • コードは、 nintlongと同じ範囲を提供する 64 ビット プラットフォームを対象としています。
  • マルチスレッド コンテキスト内の大きな整数値へのアトミック アクセスが必要です。
  • プラットフォーム固有の整数サイズの動作は、ユース ケースで許容されます。

ネイティブ サイズの整数の詳細については、「 整数の数値型」を参照してください。

スレッド セーフなプログラミングに関する一般的なガイダンスとして、volatileフィールドではなく、Interlocked操作または lock ステートメントを使用することを検討してください。