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.
Diversi errori si riferiscono alla dichiarazione e all'uso di espressioni lambda e metodi anonimi:
- CS0407: 'method' ha il tipo restituito errato.
- CS0428: impossibile convertire il gruppo di metodi 'Identifier' in tipo non delegato 'type'. Si intende richiamare il metodo?
- CS0748: utilizzo di parametri lambda incoerenti. I tipi di parametro devono essere tutti espliciti o tutti impliciti.
- CS0815: impossibile assegnare 'expression' a una variabile tipizzata in modo implicito.
- CS0828: impossibile assegnare 'expression' alla proprietà di tipo anonimo.
- CS0837: il primo operando di un operatore 'is' o 'as' potrebbe non essere un'espressione lambda, un metodo anonimo o un gruppo di metodi.
- CS1065: i valori predefiniti non sono validi in questo contesto.
- CS1621: l'istruzione yield non può essere usata all'interno di un metodo anonimo o di un'espressione lambda.
-
CS1628: impossibile usare
inrefooutparametri all'interno di un metodo anonimo, un'espressione lambda o un'espressione di query. - CS1632: il controllo non può lasciare il corpo di un metodo anonimo o di un'espressione lambda.
- CS1643: non tutti i percorsi di codice restituiscono un valore nel metodo anonimo di tipo 'type'.
- CS1660: impossibile convertire l'espressione lambda nel tipo 'type' perché non è un tipo delegato.
- CS1661: impossibile convertire il blocco di metodi anonimi nel tipo 'type' perché i tipi di parametro non corrispondono ai tipi di parametro delegato.
- CS1662: impossibile convertire il blocco di metodi anonimi nel tipo delegato previsto perché alcuni dei tipi restituiti nel blocco non sono convertibili in modo implicito nel tipo restituito del delegato.
- CS1673: metodi anonimi, espressioni lambda ed espressioni di query all'interno di struct non possono accedere ai membri dell'istanza di "this".
- CS1676: il parametro 'number' deve essere dichiarato con la parola chiave 'keyword'.
- CS1677: il parametro 'number' non deve essere dichiarato con la parola chiave 'keyword'.
- CS1678: il parametro 'number' è dichiarato come tipo 'type1' ma deve essere 'type2'.
- CS1686: variabile locale o i relativi membri non possono avere l'indirizzo preso e essere usati all'interno di un metodo anonimo o di un'espressione lambda.
- CS1688: impossibile convertire il blocco di metodi anonimi senza un elenco di parametri nel tipo delegato 'delegate' perché contiene uno o più parametri out.
- CS1706: l'espressione non può contenere metodi anonimi o espressioni lambda.
- CS1731: impossibile convertire l'espressione in delegato perché alcuni dei tipi restituiti nel blocco non sono convertibili in modo implicito nel tipo restituito del delegato.
- CS1732: parametro previsto.
- CS1764: Impossibile usare una variabile locale fissata all'interno di un metodo anonimo, un'espressione lambda o un'espressione di query.
- CS8030: la funzione anonima convertita in un delegato che restituisce void non può restituire un valore.
- CS8175: impossibile usare ref local all'interno di un metodo anonimo, un'espressione lambda o un'espressione di query.
- CS8820: una funzione anonima statica non può contenere un riferimento a 'variable'.
- CS8821: una funzione anonima statica non può contenere un riferimento a 'this' o 'base'.
- CS8916: gli attributi nelle espressioni lambda richiedono un elenco di parametri racchiusi tra parentesi.
- CS8917: Impossibile dedurre il tipo delegato.
- CS8934: impossibile convertire il metodo anonimo nel tipo 'type' perché il tipo restituito non corrisponde al tipo restituito delegato.
-
CS8975: la parola chiave
varcontestuale non può essere usata come tipo di ritorno esplicito della lambda. - CS9098: parametro lambda tipizzato in modo implicito '...' non può avere un valore predefinito.
Inoltre, diversi avvisi si riferiscono alla dichiarazione e all'uso di espressioni lambda:
- CS0467: Ambiguità tra il metodo 'method' e l'elemento non metodi 'non-method'. Si utilizza il gruppo di metodi.
- CS1911: l'accesso al membro tramite una parola chiave 'base' da un metodo anonimo, un'espressione lambda, un'espressione di query o un iteratore genera codice non verificabile.
- CS8971: InterpolatedStringHandlerArgument non ha alcun effetto se applicato ai parametri lambda e verrà ignorato nel sito di chiamata.
- CS8974: conversione del gruppo di metodi 'method' in tipo non delegato 'type'. Si intende richiamare il metodo?
- CS9099: il valore del parametro predefinito non corrisponde al tipo delegato di destinazione.
- CS9100: il parametro ha modificatore params in lambda ma non nel tipo delegato di destinazione.
Il compilatore genera anche il messaggio informativo seguente:
- CS9236: La compilazione richiede di legare l'espressione lambda almeno un certo numero di volte. Valuta la possibilità di dichiarare l'espressione lambda con tipi di parametro espliciti oppure, se la chiamata al metodo contenitore è generica, valuta l'utilizzo di argomenti di tipo esplicito.
Limitazioni della sintassi nelle espressioni lambda
-
CS0837: il primo operando di un
isoperatore oaspotrebbe non essere un'espressione lambda, un metodo anonimo o un gruppo di metodi. -
CS1621: l'istruzione
yieldnon può essere usata all'interno di un metodo anonimo o di un'espressione lambda. -
CS1628: non è possibile usare
inil parametro ,refooutall'interno di un metodo anonimo, un'espressione lambda o un'espressione di query. - CS1632: Controllo non può lasciare il corpo di un metodo anonimo o di un'espressione lambda.
-
CS1673: metodi anonimi, espressioni lambda ed espressioni di query all'interno di struct non possono accedere ai membri dell'istanza di
this. - CS1686: variabile locale o i relativi membri non possono avere l'indirizzo preso e essere usati all'interno di un metodo anonimo o di un'espressione lambda.
- CS1706: l'espressione non può contenere metodi anonimi o espressioni lambda.
- CS1764: Impossibile usare una variabile locale fissa all'interno di un metodo anonimo, un'espressione lambda o un'espressione di query.
- CS1911: avviso: l'accesso al membro tramite una parola chiave 'base' da un metodo anonimo, un'espressione lambda, un'espressione di query o un iteratore genera codice non verificabile.
- CS8175: impossibile usare ref local all'interno di un metodo anonimo, un'espressione lambda o un'espressione di query.
- CS8820: una funzione anonima statica non può contenere un riferimento a 'variable'.
- CS8821: una funzione anonima statica non può contenere un riferimento a 'this' o 'base'.
- CS8971: Avviso: InterpolatedStringHandlerArgument non ha alcun effetto se applicato ai parametri lambda e verrà ignorato nel sito di chiamata.
- CS9236: Informazioni: la compilazione richiede l'associazione dell'espressione lambda almeno un numero di volte specificato. Si consiglia di dichiarare l'espressione lambda utilizzando tipi di parametro espliciti o, se la chiamata al metodo contenitore è generica, valutare l'uso di argomenti di tipo esplicito.
Il compilatore impedisce determinati costrutti C# all'interno di espressioni lambda e metodi anonimi. Queste restrizioni esistono perché il compilatore trasforma espressioni lambda e metodi anonimi in chiamate delegate o alberi delle espressioni e alcuni costrutti non possono essere rappresentati in tali moduli. Per altre informazioni, vedere la sezione espressioni di funzione anonima della specifica C#.
È possibile correggere questi errori usando le indicazioni seguenti:
- Spostare qualsiasi istruzione di
yield returno diyield breakdal corpo della lambda e nel metodo iteratore che lo contiene, oppure convertire la lambda in una funzione locale, che supportayieldistruzioni (CS1621). - Evitare di fare riferimento ai parametri
in,refooutdal metodo che racchiude all'interno del corpo lambda. Quando l'espressione lambda acquisisce questi parametri come parte di una chiusura, non è possibile mantenere la semantica di riferimento di parametri simili aref. Copiare il valore in una variabile locale e utilizzare tale variabile locale, oppure convertire l'espressione lambda in una funzione locale (CS1628). - Rimuovere qualsiasi
breakistruzione,gotoocontinueche trasferisca il controllo fuori dal corpo lambda. Le istruzioni del flusso di controllo devono essere destinate a etichette o cicli all'interno dello stesso corpo lambda (CS1632). - In un
structtipo, evitare di riferirsi ai membri dell'istanza tramitethisin un'espressione lambda, un metodo anonimo o un'espressione di query. Poiché il compilatore acquisiscethisper valore in un oggettostruct, le mutazioni all'interno dell'espressione lambda non influiscono sull'istanza originale. Estrarre i valori dei membri necessari nelle variabili locali prima dell'espressione lambda o convertirli in una funzione locale, accessibilethisdirettamente (CS1673). - Non prendere l'indirizzo di una variabile locale catturata anche dalla lambda. Il compilatore sposta le variabili catturate in un oggetto closure allocato nell'heap, rendendo instabile il loro indirizzo. Separare la logica di acquisizione degli indirizzi dall'espressione lambda oppure usare invece una funzione locale (CS1686).
- Spostare l'espressione lambda o il metodo anonimo dall'espressione contenitore che lo impedisce. Alcune espressioni, ad esempio costruttori di attributi, non supportano espressioni lambda o metodi anonimi come argomenti (CS1706).
- Non usare una
fixedvariabile locale all'interno di un corpo lambda. La garanzia di fissazione dell'istruzionefixedsi applica solo all'ambito circostante, non alla chiusura generata dal compilatore (CS1764). - Non usare una variabile
reflocale all'interno di un corpo lambda. Comerefi parametri, ancherefle variabili locali non possono essere acquisite nella chiusura che il compilatore genera per la lambda. Assegnare il valore a una variabile nonreflocale o convertire l'espressione lambda in una funzione locale (CS8175). - Non usare un'espressione lambda, un metodo anonimo o un gruppo di metodi come primo operando dell'operatore
isoas. Questi costrutti non hanno un tipo che può essere testato in fase di esecuzione. Assegnare prima l'espressione a una variabile, quindi testare la variabile (CS0837). - Rimuovere il
staticmodificatore dall'espressione lambda o rimuovere il riferimento alla variabile acquisita. Un'espressionestaticlambda impedisce esplicitamente l'acquisizione di variabili locali, parametri othisper evitare allocazioni di chiusura impreviste. Se è necessario fare riferimento a variabili esterne, rimuovere ilstaticmodificatore. Se vuoi mantenere minima l'allocazione dell'heap, passa i valori come parametri all'espressione lambda (CS8820, CS8821). - Rimuovere l'oggetto InterpolatedStringHandlerArgumentAttribute dal parametro lambda o spostare la logica in un metodo in cui viene rispettato l'attributo. Il compilatore ignora questo attributo sui parametri lambda perché le chiamate lambda non usano lo stesso gestore di stringhe interpolate abbassando le chiamate di metodo regolari (CS8971).
- Evitare di chiamare un membro virtuale tramite la
baseparola chiave all'interno di un metodo lambda o anonimo. Il compilatore genera una chiamata non virtuale tramite un metodo helper, che produce codice non verificabile. È consigliabile estrarre labasechiamata in un metodo separato e chiamare tale metodo dall'espressione lambda (CS1911). - Ridurre la complessità delle chiamate di metodi sovraccarichi che accettano espressioni lambda o fornire informazioni esplicite sul tipo. Quando il compilatore deve associare più volte un'espressione lambda per risolvere gli overload, genera questa diagnostica informativa. Dichiarando l'espressione lambda con tipi di parametro espliciti o fornendo argomenti di tipo espliciti nella chiamata al metodo generico, si riduce il numero di passaggi di associazione che il compilatore deve eseguire (CS9236).
Parametri di espressione lambda e restituzioni
- CS0748: utilizzo di parametri lambda incoerenti. I tipi di parametro devono essere tutti espliciti o tutti impliciti.
- CS1065: i valori predefiniti non sono validi in questo contesto.
- CS1643: non tutti i percorsi di codice restituiscono un valore nel metodo anonimo di tipo 'type'.
- CS1661: impossibile convertire il blocco di metodi anonimi nel tipo 'type' perché i tipi di parametro non corrispondono ai tipi di parametro delegato.
- CS1662: impossibile convertire il blocco di metodi anonimi nel tipo delegato previsto perché alcuni dei tipi restituiti nel blocco non sono convertibili in modo implicito nel tipo restituito del delegato.
- CS1676: il parametro 'number' deve essere dichiarato con la parola chiave 'keyword'.
- CS1677: il parametro 'number' non deve essere dichiarato con la parola chiave 'keyword'.
- CS1678: il parametro 'number' è dichiarato come tipo 'type1' ma deve essere 'type2'.
- CS1688: impossibile convertire il blocco di metodi anonimi senza un elenco di parametri nel tipo delegato 'delegate' perché contiene uno o più parametri out.
- CS1731: impossibile convertire l'espressione in delegato perché alcuni dei tipi restituiti nel blocco non sono convertibili in modo implicito nel tipo restituito del delegato.
- CS1732: parametro previsto.
- CS8030: la funzione anonima convertita in un delegato che restituisce void non può restituire un valore.
- CS8916: gli attributi nelle espressioni lambda richiedono un elenco di parametri racchiusi tra parentesi.
- CS8934: impossibile convertire il metodo anonimo nel tipo 'type' perché il tipo restituito non corrisponde al tipo restituito delegato.
- CS8975: la parola chiave contestuale 'var' non può essere usata come tipo restituito lambda esplicito.
- CS9098: parametro lambda tipizzato in modo implicito '...' non può avere un valore predefinito.
Questi errori indicano un problema con un parametro di espressione lambda o una dichiarazione di tipo restituito. Per le regole complete sui parametri lambda e sui tipi restituiti, vedere la sezione espressioni lambda, metodi anonimi e espressioni di funzione anonime della specifica C#.
Annotazioni
CS1731 e CS1732 non sono più prodotti dalla versione corrente del compilatore C# (Roslyn). Potrebbero apparire se si usa una versione precedente del compilatore.
È possibile correggere questi errori usando le indicazioni seguenti:
- Assicurarsi che tutti i parametri in un'espressione lambda usino lo stesso stile di digitazione. Quando un'espressione lambda ha più parametri, ogni parametro deve essere tipizzato in modo esplicito o tipizzato in modo implicito. Non è possibile combinare i due stili nello stesso elenco di parametri (CS0748).
- Aggiungere tipi espliciti a qualsiasi parametro lambda con un valore predefinito. Il compilatore richiede tipi espliciti sui parametri con valori predefiniti perché deve generare un tipo delegato personalizzato che codifica il valore predefinito. I parametri tipizzato in modo implicito non forniscono informazioni sufficienti per il compilatore per costruire il tipo delegato (CS1065, CS9098).
- Rimuovere i valori predefiniti dei parametri dai metodi anonimi dichiarati usando l'operatore
delegate. I valori dei parametri predefiniti sono supportati solo nelle espressioni lambda, non nei metodi anonimi. Convertire il metodo anonimo in un'espressione lambda se sono necessari valori predefiniti (CS1065). - Associare i tipi di parametro, i modificatori
e il numero di parametri del metodo lambda o anonimo al tipo delegato di destinazione . Il compilatore esegue una corrispondenza esatta delle firme dei parametri durante la conversione di una funzione anonima in un delegato: ogni parametro deve avere il tipo corretto e qualsiasi refmodificatore ,outoindeve essere presente esattamente quando il delegato lo prevede (CS1661, CS1676, CS1677, CS1678). - Aggiungere un elenco di parametri al metodo anonimo quando il tipo delegato di destinazione ha
outparametri. Un metodo anonimo dichiarato senza un elenco di parametri (usandodelegate { }la sintassi) può corrispondere alla maggior parte dei tipi delegati, ma il compilatore non può sintetizzare in modo implicito i parametri necessariout. Dichiarare i parametri in modo esplicito in modo che corrispondano alla firma del delegato (CS1688). - Assicurarsi che tutti i percorsi di codice nei metodi lambda o anonimi restituiscano un valore quando il tipo delegato di destinazione ha un tipo di ritorno diverso da void. Ogni ramo attraverso il corpo deve produrre un valore restituito che è implicitamente convertibile nel tipo restituito del delegato (CS1643, CS1662, CS1731, CS8934).
- Rimuovere qualsiasi
returnistruzione che contiene un valore da un metodo lambda o anonimo assegnato a un tipo delegato che restituiscevoid, ad esempioAction. Poiché il tipo restituito del delegato èvoid, l'implementazione non può restituire un valore (CS8030). - Racchiudere l'elenco di parametri tra parentesi quando gli attributi vengono applicati a qualsiasi parametro lambda. Il compilatore deve avere la forma racchiusa tra parentesi per distinguere la sintassi degli attributi da altre espressioni. Ad esempio, scrivere
([MyAttribute] int x) => xanziché[MyAttribute] x => x(CS8916). - Usare un nome di tipo specifico anziché
varcome tipo restituito esplicito di un'espressione lambda. La parola chiavevarè riservata alle variabili locali tipizzate in modo implicito e non può essere usata come annotazione del tipo restituito lambda. Specificare il tipo restituito effettivo o omettere il tipo restituito e lasciare che il compilatore lo deduca (CS8975). - Correggere l'elenco di parametri in modo che il compilatore possa riconoscerlo come dichiarazione di parametro valida. Questo errore indica un elenco di parametri in formato non valido in cui il compilatore ha previsto un identificatore di parametro ma ha trovato qualcos'altro (CS1732).
Tipo di espressione lambda delegato
- CS0407: 'method' ha il tipo restituito errato.
- CS0428: impossibile convertire il gruppo di metodi 'Identifier' in tipo non delegato 'type'. Si intende richiamare il metodo?
- CS0467: Avviso: ambiguità tra metodo 'method' e 'non-method'. Uso del gruppo di metodi.
- CS0815: impossibile assegnare 'expression' a una variabile tipizzata in modo implicito.
- CS0828: impossibile assegnare 'expression' alla proprietà di tipo anonimo.
- CS1660: impossibile convertire l'espressione lambda nel tipo 'type' perché non è un tipo delegato.
- CS8917: Impossibile dedurre il tipo delegato.
- CS8974: avviso: conversione del gruppo di metodi 'method' in tipo non delegato 'type'. Si intende richiamare il metodo?
- CS9099: Avviso: il valore del parametro predefinito non corrisponde al tipo di delegato di destinazione.
- CS9100: Avviso: il parametro utilizza il modificatore params nella lambda ma non nel tipo delegato di destinazione.
Questi errori indicano un problema con il tipo delegato che il compilatore deduce o prevede un'espressione lambda, un metodo anonimo o un gruppo di metodi. Per le regole complete sulle conversioni dei delegati, vedere la sezione espressioni lambda, metodi anonimi e espressioni di funzione anonime della specifica C#.
Annotazioni
La versione corrente del compilatore C# (Roslyn) non produce CS0467. Questo errore potrebbe essere visualizzato se si usa una versione precedente del compilatore.
È possibile correggere questi errori usando le indicazioni seguenti:
- Assicurarsi che il tipo di destinazione dell'assegnazione o della conversione sia un tipo delegato o System.Linq.Expressions.Expression. Non è possibile assegnare un'espressione lambda o un metodo anonimo a un tipo non delegato,
objectad esempio o a un'interfaccia. Modificare il tipo della variabile in un tipo delegato compatibile comeFunc<>oAction<>oppure usarevarper consentire al compilatore di dedurre il tipo delegato (CS1660). - Fornire un contesto sufficiente per il compilatore per determinare un singolo tipo delegato per l'espressione lambda. Se assegnato a
var, il compilatore richiede un tipo restituito e un elenco di parametri non ambigui. Se assegnato a una proprietà di tipo anonimo, il compilatore non può dedurre affatto un tipo delegato. Assegnare l'espressione lambda a una variabile con un tipo delegato esplicito, quindi usare tale variabile nell'inizializzatore di tipo anonimo (CS0815, CS0828, CS8917). - Abbina il tipo restituito del gruppo di metodi al tipo di ritorno dichiarato del delegato. La conversione di un gruppo di metodi richiede che il tipo di ritorno del metodo sia convertibile tramite identità o convertibile implicitamente al tipo di ritorno del delegato. Modificare il tipo restituito del metodo o modificare il tipo delegato in modo che corrisponda (CS0407).
- Richiamare il metodo anziché assegnare il gruppo di metodi quando il tipo di destinazione non è un delegato. Se il tipo di destinazione è
string,into un altro tipo non delegato, è probabile che si intende chiamare il metodo e assegnarne il risultato. Aggiungere parentesi e argomenti per richiamare il metodo (CS0428, CS8974). - Risolvere l'ambiguità tra un metodo e un membro non metodo che condividono lo stesso nome. Rinominare uno dei membri in conflitto o usare un riferimento completo per rimuovere l'ambiguità (CS0467).
- Rimuovere il valore del parametro predefinito o
paramsmodificatore dall'espressione lambda quando il tipo di delegato di destinazione è un tipo standardFunc<>oAction<>. I valori predefiniti eparamsi modificatori fanno sì che il compilatore generi un tipo di delegato personalizzato che non corrisponde né aFunc<>né aAction<>.varUsare per consentire al compilatore di sintetizzare il tipo delegato corretto o rimuovere il valore predefinito oparamsil modificatore in modo che l'espressione lambda corrisponda al tipo delegato dichiarato (CS9099, CS9100).