Condividi tramite


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 è un ref struct o un parametro di tipo che consente ref 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 valori ref struct.
  • CS9050: un campo ref non può fare riferimento a ref 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 compilazioneIDisposable.
  • 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 valori ref struct.
  • CS9050: un campo ref non può fare riferimento a ref struct.
  • CS9059: un campo ref può essere dichiarato solo in un oggetto ref 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à implementate ref automaticamente.
  • Solo i tipi ref struct o le variabili ref possono avere il modificatore scoped.
  • È possibile dichiarare un campo ref solo in un tipo ref struct.
  • Un campo ref non può fare riferimento a un tipo ref 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 è un ref struct o un parametro di tipo che consente 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 compilazioneIDisposable.
  • 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 tipo ref 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-vincolo allows ref struct. L’anti-vincolo allows ref struct deve essere l'ultimo nella clausola where 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 un ref struct tipo non può essere usato come tipo di elemento per un metodo iteratore.