Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il compilatore C# genera errori e avvisi quando si usano tipi di record in modo improprio. I tipi di record forniscono membri predefiniti che implementano l'uguaglianza basata su valori. Questa diagnostica consente di seguire le regole per dichiarare e usare i tipi di record.
- CS8851: 'type' definisce 'Equals' ma non 'GetHashCode'
-
CS8857: il ricevitore di un'espressione
withdeve avere un tipo non void. - CS8858: il tipo di ricevitore 'type' non è un tipo di record valido e non è un tipo struct.
- CS8859: i membri denominati 'Clone' non sono consentiti nei record.
- CS8860: i tipi e gli alias non devono essere denominati 'record'.
- CS8864: i record possono ereditare solo dall'oggetto o da un altro record.
- CS8865: Solo i record possono ereditare dai record.
- CS8866: il membro record 'member' deve essere una proprietà di istanza leggibile o un campo di tipo 'type' per corrispondere al parametro posizionale 'parameter'.
- CS8869: 'member' non esegue l'override del metodo previsto da 'object'.
- CS8870: 'membro' non può essere sigillato perché il record che lo contiene non è sigillato.
- CS8871: 'member' non esegue l'override del metodo previsto da 'type'.
- CS8872: 'member' deve consentire di essere sovrascritto perché il record contenitore non è sigillato.
- CS8873: Il membro di un record 'member' deve essere pubblico.
- CS8874: il membro del record 'member' deve restituire 'type'.
- CS8875: Il membro del record 'member' deve essere protetto.
- CS8876: 'member' non esegue l'override della proprietà prevista da 'type'.
- CS8877: Il membro del record 'member' non può essere statico.
- CS8879: il membro del record 'member' deve essere privato.
- CS8906: la proprietà del contratto di uguaglianza dei record 'member' deve avere una funzione di accesso get.
- CS8908: il tipo 'type' potrebbe non essere utilizzato per un campo di un record.
- CS8913: il membro posizionale 'member' trovato corrispondente a questo parametro è nascosto.
In questo articolo viene inoltre illustrato l'avviso seguente:
- CS8907: il parametro 'name' non è letto. Si è dimenticato di usarlo per inizializzare la proprietà con tale nome?
Firme dei membri sintetizzati
- CS8869: 'member' non esegue l'override del metodo previsto da 'object'.
- CS8870: 'member' non può essere sigillato perché il record contenitore non è sigillato.
- CS8871: 'member' non sovrascrive il metodo previsto dal 'type'.
- CS8872: 'member' deve consentire l'override perché il record che lo contiene non è sigillato.
- CS8873: Il membro di un record 'member' deve essere pubblico.
- CS8874: il membro del record 'member' deve restituire 'type'.
- CS8875: il membro del record 'member' deve essere protetto.
- CS8876: 'member' non esegue l'override della proprietà prevista da 'type'.
- CS8877: il membro del record 'member' potrebbe non essere statico.
- CS8879: Il membro di record 'member' deve essere privato.
- CS8906: la proprietà del contratto di uguaglianza dei record 'member' deve avere una funzione di accesso get.
Quando si dichiara in modo esplicito un membro che il compilatore sintetizzerebbe altrimenti per un tipo di record, la dichiarazione deve corrispondere alla firma, all'accessibilità e ai modificatori attesi. Per le regole complete, consultare la descrizione dei record nella specifica del linguaggio C#.
Per correggere questi errori, applicare le modifiche seguenti ai membri del record dichiarati in modo esplicito:
- Modificare l'accessibilità del metodo
Equals,GetHashCode,ToString, del metodo di de-costruzione e della proprietàEqualityContracto degli operatoriop_Equalityeop_Inequalityinpublic. Il compilatore richiede che questi membri siano accessibili pubblicamente in modo che l'uguaglianza basata su valori funzioni correttamente in tutti i contesti chiamanti (CS8873). - Modificare l'accessibilità del
PrintMembersmetodo inprotectedquando lo si dichiara in una classe di record non sigillata. Il metodo deve essereprotecteddovuto al fatto che i record derivati ne eseguono l'override per includere le proprie proprietà nell'output formattato (CS8875). - Modifica l'accessibilità del metodo
PrintMembersinprivatequando essa viene dichiarata in una classe di record sigillata o in un record struct. Poiché non esiste alcun tipo derivato, il metodo non deve essere accessibile all'esterno del tipo (CS8879). - Rimuovere il
staticmodificatore da qualsiasi membro sintetizzato dichiarato in modo esplicito. I membri sintetizzati operano su istanze di record specifiche per implementare comportamenti come confronto di uguaglianza, formattazione e copia, pertanto devono essere membri dell'istanza (CS8877). - Modificare il tipo restituito del membro in modo che corrisponda al tipo previsto dal compilatore. Ad esempio, la
EqualityContractproprietà deve restituireSystem.Typee ilEqualsmetodo deve restituirebool. Il compilatore si basa su questi tipi restituiti esatti per generare codice corretto per l'uguaglianza e altri comportamenti sintetizzati (CS8874). - Rimuovere il modificatore
sealedda qualsiasi membro sintetizzato dichiarato esplicitamente in un record non-sealed. I record derivati devono essere in grado di eseguire l'override di questi membri per fornire la propria logica di uguaglianza e formattazione basata su valori (CS8870). - Dichiarare membri sintetizzati forniti in modo esplicito come
virtualooverridein un record non sigillato. Il compilatore richiede che questi membri consentano l'override in modo che i record derivati nella gerarchia di ereditarietà possano personalizzare il comportamento (CS8872). - Assicurarsi che il membro esplicitamente dichiarato esegua l'override del metodo atteso da
objecto dal tipo di record di base. Ad esempio, il metodoEqualsdeve eseguire l'override diobject.Equals, eGetHashCodedeve eseguire l'override diobject.GetHashCode. Il compilatore verifica che questi membri partecipino alla catena di override corretta in modo che l'uguaglianza basata su valori e altri comportamenti sintetizzati funzionino correttamente nella gerarchia dei tipi (CS8869, CS8871). - Assicurati che la proprietà
EqualityContractesplicitamente dichiarata sostituisca la proprietà base del recordEqualityContract. Il compilatore si basa sulla catena di override per il contratto di uguaglianza per distinguere i tipi di record in fase di esecuzione all'interno della gerarchia di ereditarietà (CS8876). - Aggiungere un
getaccessor alla proprietàEqualityContract. Il compilatore legge il contratto di uguaglianza in fase di esecuzione per determinare se due istanze di record sono dello stesso tipo, pertanto la proprietà deve essere leggibile (CS8906).
Membri posizionale
- CS8866: il membro record 'member' deve essere una proprietà dell'istanza leggibile o un campo di tipo 'type' per trovare la corrispondenza con il parametro posizionale 'parameter'.
- CS8907: il parametro 'name' non è letto. Si è dimenticato di usarlo per inizializzare la proprietà con tale nome?
- CS8908: il tipo 'type' potrebbe non essere utilizzato per un campo di un record.
- CS8913: il membro posizionale 'member' trovato corrispondente a questo parametro è nascosto.
Quando si dichiara un record posizionale, il compilatore sintetizza le proprietà che corrispondono a ogni parametro posizionale. Questa diagnostica indica che le dichiarazioni esplicite sono in conflitto con quelle proprietà sintetizzate. Per le regole complete, consultare la descrizione dei record nella specifica del linguaggio C#.
Per correggere questi errori, applicare le seguenti modifiche alle dichiarazioni di record di posizione.
- Modificare qualsiasi membro dichiarato in modo esplicito che corrisponda a un parametro posizionale in modo che sia una proprietà o un campo di istanza leggibile con lo stesso tipo del parametro. Il compilatore richiede che il membro sia leggibile e compatibile con i tipi in modo che il metodo sintetizzato
Deconstructe la corrispondenza dei criteri di posizione possano accedere correttamente al valore (CS8866). - Assicurati che ogni parametro posizionale inizializzi la proprietà corrispondente nel corpo del costruttore quando fornisci un costruttore esplicito. Il compilatore genera un avviso quando un parametro non viene usato perché in genere indica un errore di digitazione o una mancata corrispondenza tra il nome del parametro e il nome della proprietà, che lascerebbe la proprietà non inizializzata (CS8907).
- Modificare il tipo di un campo dichiarato in un record in un tipo valido in tale contesto. Alcuni tipi, ad esempio
Span<T>o altriref structtipi, non possono essere usati come campi in un record perché i tipi di record richiedono che tutti i campi siano compatibili con l'allocazione heap e l'uguaglianza basata su valori (CS8908). - Rimuovere il
newmodificatore da un membro in un record derivato che nasconde un membro posizionale del record di base. Quando un membro posizionale è nascosto, il compilatore non può corrispondere al parametro posizionale alla proprietà corrispondente, che interrompe il metodo sintetizzatoDeconstructe la corrispondenza dei criteri di posizione (CS8913).
Membri per l'uguaglianza
- CS8851: 'type' definisce 'Equals' ma non 'GetHashCode'
-
CS8857: il ricevitore di un'espressione
withdeve avere un tipo non void. - CS8858: il tipo di ricevitore 'type' non è un tipo di record valido e non è un tipo struct.
I tipi di record forniscono l'uguaglianza predefinita basata su valori. Questa diagnostica si verifica quando le dichiarazioni sono in conflitto con il contratto di uguaglianza. Per le regole complete sull'uguaglianza, vedere Confronti di uguaglianza.
Per correggere questi errori, applicare le modifiche seguenti:
- Aggiungere un
GetHashCodemetodo ogni volta che si definisce unEqualsmetodo. Il contratto di uguaglianza richiede che gli oggetti considerati uguali producano lo stesso codice hash, quindi il compilatore impone che questi due metodi siano sempre definiti insieme (CS8851). - Modificare il ricevitore di un'espressione
within modo che si tratti di un tipo di record o di uno struct. L'espressionewithcrea una copia alterata usando il costruttore di copiarecordo la semantica di copia per valore per i tipistruct(CS8858). - Verificare che il ricevitore di un'espressione
withabbia un tipo non void. L'espressionewithproduce una nuova copia del ricevitore, pertanto il ricevitore deve restituire un valore che può essere copiato (CS8857).
Ereditarietà dei record
- CS8864: i record possono ereditare solo dall'oggetto o da un altro record
- CS8865: Solo i record possono ereditare dai record.
I tipi di classe record seguono regole di ereditarietà specifiche. Per le regole complete, consultare la descrizione dei record nella specifica del linguaggio C#.
Per correggere questi errori, applicare le modifiche seguenti:
- Modificare il tipo di base di una classe di record in modo che erediti da
objecto da un'altra classe di record. I tipi di record si basano su membri sintetizzati dal compilatore per l'uguaglianza e la copia compatibili solo con altri tipi di record, pertanto il compilatore non consente a un record di ereditare da una classe non record (CS8864). - Modificare una classe non record che eredita da una classe di record in modo che venga dichiarata come classe record. Poiché i tipi di record sintetizzano l'uguaglianza, la clonazione e altri membri che dipendono da una catena di ereditarietà coerente, il compilatore richiede che ogni tipo nella gerarchia sia una classe di record (CS8865). I record struct non possono partecipare a gerarchie di ereditarietà oltre all'implementazione delle interfacce.
Nomi dei membri riservati
- CS8859: i membri denominati 'Clone' non sono consentiti nei record.
- CS8860: i tipi e gli alias non devono essere denominati 'record'.
Il compilatore riserva determinati nomi da usare con i tipi di record. Per le regole complete, consultare la descrizione dei record nella specifica del linguaggio C#.
Per correggere questi errori, applicare le modifiche seguenti:
- Rinominare qualsiasi membro chiamato
Clonein un tipo di record con un nome diverso. Il compilatore usaCloneinternamente per implementare la semantica di copia per le espressioniwith, quindi dichiarare un proprio membroCloneentra in conflitto con l'implementazione sintetizzata (CS8859). - Rinominare qualsiasi tipo o alias denominato
recordcon un nome diverso. Poichérecordè una parola chiave contestuale usata per dichiarare i tipi di record, la denominazione di un tipo o un aliasrecordcrea ambiguità che può confondere sia il compilatore che gli sviluppatori che leggono il codice (CS8860).