'variable': 揮発性フィールドを型 'type' にすることはできません
volatile キーワードで宣言されるフィールドは、次のいずれかの型である必要があります。
任意の参照型。
任意のポインター型 (
unsafeコンテキスト内)。型
sbyte、byte、short、ushort、int、uint、char、float、bool。列挙された型のいずれかに基づく列挙型。
次の例では 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と同じですが、アトミック アクセスを保証するように設計されています。 この回避策は、次の場合に最も適しています。
- コードは、
nintがlongと同じ範囲を提供する 64 ビット プラットフォームを対象としています。 - マルチスレッド コンテキスト内の大きな整数値へのアトミック アクセスが必要です。
- プラットフォーム固有の整数サイズの動作は、ユース ケースで許容されます。
ネイティブ サイズの整数の詳細については、「 整数の数値型」を参照してください。
スレッド セーフなプログラミングに関する一般的なガイダンスとして、volatileフィールドではなく、Interlocked操作または lock ステートメントを使用することを検討してください。
.NET