Compartir a través de


Error del compilador CS0677

'variable': un campo volátil no puede ser del tipo 'type'

Los campos declarados con la volatile palabra clave deben ser uno de los siguientes tipos:

  • Cualquier tipo de referencia.

  • Cualquier tipo de puntero (en un unsafe contexto).

  • Los tipos sbyte, byte, short, ushort, int, uint, char, float, . bool

  • Tipos de enumeración basados en cualquiera de los tipos enumerados.

El ejemplo siguiente genera la advertencia CS0677:

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

Posibles soluciones alternativas

En algunos escenarios, es posible que pueda usar nint (entero de tamaño nativo) en lugar de long como solución alternativa para CS0677. Se garantiza que el nint tipo admite el acceso atómico y se puede usar con la volatile palabra clave :

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

El nint tipo es un entero de tamaño nativo que es de 32 bits en plataformas de 32 bits y de 64 bits en plataformas de 64 bits. En las plataformas de 64 bits, nint tiene el mismo tamaño y rango que long, pero está diseñado para garantizar el acceso atómico. Esta solución alternativa es más adecuada cuando:

  • El código tiene como destino plataformas de 64 bits, donde nint proporciona el mismo intervalo que long.
  • Necesita acceso atómico a un valor entero grande en un contexto multiproceso.
  • El comportamiento del tamaño entero específico de la plataforma es aceptable para su caso de uso.

Para obtener más información sobre los enteros de tamaño nativo, vea Tipos numéricos enteros.

Como guía general sobre la programación segura para subprocesos, considere la posibilidad de usar Interlocked operaciones o la lock instrucción en lugar de volatile campos.