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 deref struct
o un parámetro de tipo que permiteref 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 valoresref struct
. - CS9050: Un campo
ref
no puede hacer referencia aref 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 valoresref struct
. - CS9050: Un campo
ref
no puede hacer referencia aref struct
. - CS9059: Un campo
ref
solo se puede declarar en una instancia deref 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 implementadasref
automáticamente. - Solo los tipo
ref struct
o las variablesref
pueden tener el modificadorscoped
. - U campo
ref
solo se puede declarar en un tiporef struct
. - Un campo
ref
no puede hacer referencia a un tiporef 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 deref struct
o un parámetro de tipo que permiteref 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 tiporef 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ónallows ref struct
. La antirestricciónallows ref struct
debe ser la última en la cláusulawhere
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 unref struct
tipo no se puede usar como tipo de elemento para un método de iterador.