Compartir a través de


Errores y advertencias asociados a tipos ref struct

  • CS8343: ref structs No pueden implementar interfaces
  • CS8344: La instrucción foreach no puede funcionar en enumeradores de métodos asincrónicos o iteradores porque el tipo es una instancia de ref struct o un parámetro de tipo que permite ref struct.
  • CS8345: el campo o la propiedad implementada automáticamente no pueden ser de tipo a menos que sea un miembro de instancia de un ref struct.
  • CS9048: El modificador scoped solo se puede usar para referencias y valores ref struct.
  • CS9050: Un campo ref no puede hacer referencia a ref struct.
  • CS9059: Un campo ref solo se puede declarar en una estructura ref.
  • CS9241: Ya se ha especificado "struct ref".
  • CS9242: La cláusula de restricción "allows" debe ser la última restricción especificada.
  • CS9243: No se pueden permitir estructuras ref para un parámetro de tipo conocido de otras restricciones como una clase.
  • CS9244: Es posible que el tipo no sea una instancia de ref struct o un parámetro de tipo que permita structs ref para usarlo como parámetro en el tipo o método genéricos.
  • CS9245: El tipo no puede implementar el miembro de interfaz para el tipo ref struct.
  • CS9246: No se puede acceder a un miembro de interfaz de instancia no virtual en un parámetro de tipo que permita la estructura ref.
  • CS9247: La instrucción foreach no puede funcionar en enumeradores de tipo porque es un parámetro de tipo que permite la estructura ref y no se conoce en tiempo de compilación para implementar IDisposable.
  • CS9267: Es posible que el tipo de elemento de un iterador no sea una estructura ref o un parámetro de tipo que permita structs ref.

Infracciones de seguridad de ref

  • CS8345: el campo o la propiedad implementada automáticamente no pueden ser de tipo a menos que sea un miembro de instancia de un ref struct.
  • CS9048: El modificador scoped solo se puede usar para referencias y valores ref struct.
  • CS9050: Un campo ref no puede hacer referencia a ref struct.
  • CS9059: Un campo ref solo se puede declarar en una instancia de ref struct..

Un tipo ref struct puede incluir campos ref. Los campos ref no se permiten en otros tipos. El compilador aplica restricciones en las declaraciones y el uso de los tipos ref struct para aplicar reglas de seguridad de ref en instancias de cualquier tipo ref struct:

  • Solo ref struct los tipos pueden contener propiedades implementadas ref automáticamente.
  • Solo los tipo ref struct o las variables ref pueden tener el modificador scoped.
  • U campo ref solo se puede declarar en un tipo ref struct.
  • Un campo ref no puede hacer referencia a un tipo ref struct/

La infracción de cualquiera de estas reglas produce uno de los errores indicados. Si pretende usar esa característica de lenguaje, convierta el tipo en una instancia de ref struct. De lo contrario, quite la construcción no permitida.

Implementaciones de interfaz de estructura ref

  • CS8343: ref structs No pueden implementar interfaces
  • CS8344: La instrucción foreach no puede funcionar en enumeradores de métodos asincrónicos o iteradores porque el tipo es una instancia de ref struct o un parámetro de tipo que permite ref struct.
  • CS9241: Ya se ha especificado "struct ref".
  • CS9242: La cláusula de restricción "allows" debe ser la última restricción especificada.
  • CS9243: No se pueden permitir estructuras ref para un parámetro de tipo conocido de otras restricciones como una clase.
  • CS9244: Es posible que el tipo no sea una instancia de ref struct o un parámetro de tipo que permita structs ref para usarlo como parámetro en el tipo o método genéricos.
  • CS9245: El tipo no puede implementar el miembro de interfaz para el tipo ref struct.
  • CS9246: No se puede acceder a un miembro de interfaz de instancia no virtual en un parámetro de tipo que permita la estructura ref.
  • CS9247: La instrucción foreach no puede funcionar en enumeradores de tipo porque es un parámetro de tipo que permite la estructura ref y no se conoce en tiempo de compilación para implementar IDisposable.
  • CS9267: Es posible que el tipo de elemento de un iterador no sea una estructura ref o un parámetro de tipo que permita structs ref.

Antes de C# 13, los tipos ref struct no pueden implementar interfaces; el compilador genera CS8343. A partir de C# 13, los tipos ref struct pueden implementar interfaces, en función de las reglas siguientes:

  • Un ref struct no se puede convertir en una instancia de una interfaz que implementa. Esta restricción incluye la conversión implícita cuando se usa un tipo ref struct como argumento cuando el parámetro es un tipo de interfaz. La conversión da como resultado una conversión boxing, que infringe la seguridad ref.
  • Un ref struct que implementa una interfaz debe implementar todos los miembros de la interfaz. ref struct debe implementar miembros en los que la interfaz incluya una implementación predeterminada.

A partir de C# 13, se puede usarref struct como argumento de tipo para un parámetro de tipo genérico, si y solo si el parámetro de tipo genérico tiene la antirestricción allows ref struct. Al usar la antirestricción allows ref struct, debe seguir estas reglas:

  • Se usa ref struct como argumento de tipo, el parámetro de tipo debe tener la antirestricción allows ref struct. La antirestricción allows ref struct debe ser la última en la cláusula where para ese parámetro
  • Los usos de instancias del parámetro de tipo deben obedecer las reglas de seguridad de ref.
  • Un ref struct argumento de tipo o que puede ser un ref struct tipo no se puede usar como tipo de elemento para un método de iterador.