Errori e avvisi associati ai tipi ref struct
- CS8343:
ref structs
impossibile implementare interfacce - CS8344:
foreach
l'istruzione non può operare sugli enumeratori nei metodi asincroni o iteratori perché il tipo è unref struct
o un parametro di tipo che consenteref struct
. - CS8345: un campo o una proprietà implementata automaticamente non può essere di tipo a meno che non sia un membro di istanza di un valore
ref struct
. - CS9048: il modificatore
scoped
può essere usato solo per ref e i valoriref struct
. - CS9050: un campo
ref
non può fare riferimento aref struct
. - CS9059: un campo ref può essere dichiarato solo in un ref struct.
- CS9241: 'ref struct' è già specificato.
- CS9242: la clausola di vincolo 'allows' deve essere l'ultimo vincolo specificato.
- CS9243: impossibile consentire reft struct per un parametro di tipo noto da altri vincoli come classe.
- CS9244: il tipo potrebbe non essere un
ref struct
o un parametro di tipo che consente ref struct per usarlo come parametro nel tipo o nel metodo generico. - CS9245: il tipo non può implementare il membro dell'interfaccia per il tipo
ref struct
. - CS9246: non è possibile accedere a un membro dell'interfaccia dell'istanza non virtuale su un parametro di tipo che consente ref struct.
- CS9247: l'istruzione foreach non può operare sugli enumeratori di tipo perché è un parametro di tipo che consente ref struct e non è noto per l’implementazione in fase di compilazione
IDisposable
. - CS9267: il tipo di elemento di un iteratore potrebbe non essere uno struct di riferimento o un parametro di tipo che consente struct di riferimento
Violazioni di sicurezza delle variabili ref
- CS8345: un campo o una proprietà implementata automaticamente non può essere di tipo a meno che non sia un membro di istanza di un valore
ref struct
. - CS9048: il modificatore
scoped
può essere usato solo per ref e i valoriref struct
. - CS9050: un campo
ref
non può fare riferimento aref struct
. - CS9059: un campo
ref
può essere dichiarato solo in un oggettoref struct
.
Un tipo ref struct
può includere campi ref
. Altri tipi non sono campi ref
consentiti. Il compilatore applica restrizioni alle dichiarazioni e all'uso dei tipi ref struct
per applicare le regole di sicurezza ref alle istanze di qualsiasi tipo ref struct
:
- Solo
ref struct
i tipi possono contenere proprietà implementateref
automaticamente. - Solo i tipi
ref struct
o le variabiliref
possono avere il modificatorescoped
. - È possibile dichiarare un campo
ref
solo in un tiporef struct
. - Un campo
ref
non può fare riferimento a un tiporef struct
.
La violazione di una di queste regole genera uno degli errori elencati. Se si intende usare tale funzionalità del linguaggio, convertire il tipo in un oggetto ref struct
. In caso contrario, rimuovere il costrutto non consentito.
implementazioni dell'interfaccia ref struct
- CS8343:
ref structs
impossibile implementare interfacce - CS8344:
foreach
l'istruzione non può operare sugli enumeratori nei metodi asincroni o iteratori perché il tipo è unref struct
o un parametro di tipo che consenteref struct
. - CS9241: 'ref struct' è già specificato.
- CS9242: la clausola di vincolo 'allows' deve essere l'ultimo vincolo specificato.
- CS9243: impossibile consentire reft struct per un parametro di tipo noto da altri vincoli come classe.
- CS9244: il tipo potrebbe non essere un
ref struct
o un parametro di tipo che consente ref struct per usarlo come parametro nel tipo o nel metodo generico. - CS9245: il tipo non può implementare il membro dell'interfaccia per il tipo
ref struct
. - CS9246: non è possibile accedere a un membro dell'interfaccia dell'istanza non virtuale su un parametro di tipo che consente ref struct.
- CS9247: l'istruzione foreach non può operare sugli enumeratori di tipo perché è un parametro di tipo che consente ref struct e non è noto per l’implementazione in fase di compilazione
IDisposable
. - CS9267: il tipo di elemento di un iteratore potrebbe non essere uno struct di riferimento o un parametro di tipo che consente struct di riferimento
Prima di C# 13, i tipi ref struct
non possono implementare interfacce. Il compilatore genera l'errore CS8343. A partire da C# 13, i tipi ref struct
possono implementare interfacce, sottostando alle regole seguenti:
ref struct
non può essere convertito in un'istanza di un'interfaccia implementata. Questa restrizione include la conversione implicita quando si usa un tiporef struct
come argomento quando il parametro è un tipo di interfaccia. La conversione comporta una conversione boxing, che viola la sicurezza di riferimento.ref struct
che implementa un'interfaccia deve implementare tutti i membri dell'interfaccia.ref struct
deve implementare i membri in cui l'interfaccia include un'implementazione predefinita.
A partire da C# 13, un ref struct
può essere usato come argomento di tipo per un parametro di tipo generico, se e solo se il parametro di tipo generico ha il l’anti-vincolo allows ref struct
. Quando si usa l'anti-vincolo allows ref struct
, è necessario seguire queste regole:
ref struct
viene utilizzato come argomento di tipo, il parametro di tipo deve avere l'anti-vincoloallows ref struct
. L’anti-vincoloallows ref struct
deve essere l'ultimo nella clausolawhere
per tale parametro- L'uso di istanze del parametro di tipo deve rispettare le regole di sicurezza di riferimento.
- Un
ref struct
argomento di tipo o che può essere unref struct
tipo non può essere usato come tipo di elemento per un metodo iteratore.