Risolvere gli errori e gli avvisi che influiscono sulla risoluzione dell'overload.
Questo articolo illustra gli errori del compilatore seguenti:
- CS0034 - L'operatore è ambiguo sugli operandi di tipo '
type1
' e 'type2
' - CS0035 - L'operatore è ambiguo su un operando di tipo 'type'
- CS0111 - Il tipo già definisce un membro denominato 'name' con gli stessi tipi di parametro
- CS0121 - La chiamata è ambigua tra i seguenti metodi o proprietà
- CS0457 - Conversioni definite dall'utente ambigue durante la conversione da 'type1' a 'type2'
- CS0663 - Impossibile definire metodi di overload che differiscono solo per
ref
eout
. - CS1007 - La funzione di accesso alla proprietà è già definita
- CS1019 - È previsto un operatore unario che supporti l'overload
- CS1020 - È previsto un operatore binario che supporti l'overload
- CS1501 - Nessun overload per il metodo 'method' accetta argomenti 'number'
- CS1534 - L'operatore binario di overload 'operator' accetta due parametri
- CS1535 - L'operatore unario di overload 'operator' accetta un parametro
- CS1928 - 'Type' non contiene una definizione per 'method' e il miglior overload 'method' del metodo di estensione contiene alcuni argomenti non validi.
- CS1929 - 'TypeA' non contiene una definizione per 'method' e il miglior overload 'TypeB.method' del metodo di estensione richiede un ricevitore di tipo 'TypeC'
- CS8315 - L'operatore è ambiguo sugli operandi
- CS9261 - Impossibile usare '
OverloadResolutionPriorityAttribute
' su un membro di sostituzione. - CS9262 - Impossibile usare '
OverloadResolutionPriorityAttribute
' su questo membro.
Inoltre, il seguente avviso del compilatore:
- CS3006 - Il metodo di overload 'method' che differisce solo per
ref
oout
o per numero di dimensioni della matrice non è conforme a CLS
Definizione di overload non corretta
- CS0663 - Impossibile definire metodi di overload che differiscono solo per
ref
eout
. - CS1019 - È previsto un operatore unario che supporti l'overload
- CS1020 - È previsto un operatore binario che supporti l'overload
- CS1534 - L'operatore binario di overload 'operator' accetta due parametri
- CS1535 - L'operatore unario di overload 'operator' accetta un parametro
Inoltre, il seguente avviso del compilatore:
- CS3006 - Il metodo di overload 'method' che differisce solo per
ref
oout
o per numero di dimensioni della matrice non è conforme a CLS
Quando si creano operatori di overload nella classe, la firma deve corrispondere al numero di parametri necessari per tale operatore. Numero errato di parametri nella definizione dell'operatore.
Inoltre, gli operatori di overload devono usare il nome dell'operatore definito. L'unica eccezione è quando si crea un operatore di conversione, dove il nome dell'operatore corrisponde al tipo restituito della conversione.
Overload duplicati definiti
- CS0111 - Il tipo già definisce un membro denominato 'name' con gli stessi tipi di parametro
- CS1007 - La funzione di accesso alla proprietà è già definita
Questi errori indicano che sono stati creati overload non diversi. I più comuni sono:
- I tipi di parametro corrispondenti hanno una conversione di identità. Ad esempio
M(dynamic)
eM(object)
oM2(string)
eM2(string?)
. - I tipi di parametro corrispondenti differiscono solo nel modificatore di riferimento. Ad esempio,
M(ref int)
eM(out int)
. - Sono state incluse sia una funzione di accesso
init
che una funzione di accessoset
per una proprietà .
Nessun overload trovato
- CS1501 - Nessun overload per il metodo 'method' accetta argomenti 'number'
- CS1928 - 'Type' non contiene una definizione per 'method' e il miglior overload 'method' del metodo di estensione contiene alcuni argomenti non validi.
- CS1929 - 'TypeA' non contiene una definizione per 'method' e il miglior overload 'TypeB.method' del metodo di estensione richiede un ricevitore di tipo 'TypeC'
Il codice chiama un metodo in cui esiste il nome, ma alcuni argomenti non sono corretti o è stato usato il numero errato di argomenti. Se si sta tentando di chiamare un metodo di estensione, la classe contenitore potrebbe trovarsi in uno spazio dei nomi non importato.
Nota
L'errore CS1928
non viene usato dai compilatori più recenti. I compilatori più recenti usano esclusivamente CS1929
.
Overload ambigui
- CS0034 - L'operatore è ambiguo sugli operandi di tipo '
type1
' e 'type2
' - CS0035 - L'operatore è ambiguo su un operando di tipo 'type'
- CS0121 - La chiamata è ambigua tra i seguenti metodi o proprietà
- CS0457 - Conversioni definite dall'utente ambigue durante la conversione da 'type1' a 'type2'
- CS8315 - L'operatore è ambiguo sugli operandi
Questi errori indicano che non esiste un overload migliore di altri. Le cause degli errori possono essere diverse:
Argomenti diversi sono migliori per ogni parametro. Uno può essere una corrispondenza esatta e l'altro richiede una conversione:
void M(int a, double b) { } void M(double a, int b) {} M(1, 1); // ambiguous
Sono candidati più operatori di conversione definiti dall'utente. Gli operatori di conversione possono essere dichiarati nel tipo di origine, nei relativi tipi di base, nel tipo di destinazione o nei relativi tipi di base. Se un operatore di conversione è stato definito in più di un tipo, il compilatore non può effettuare una selezione.
Più operatori di conversione possono eseguire una conversione compatibile.
Uno o più argomenti usano
default
(notdefault(T)
) ed è possibile scegliere più tipi.
Nella maggior parte di questi casi, l'aggiunta di un cast esplicito può specificare l'overload scelto.
Priorità di risoluzione dell'overload
- CS9261 - Impossibile usare '
OverloadResolutionPriorityAttribute
' su un membro di sostituzione. - CS9262 - Impossibile usare '
OverloadResolutionPriorityAttribute
' su questo membro.
Il codice ha violato le regole per l'uso di OverloadResolutionPriorityAttribute per favorire un overload anziché un altro. Non è possibile applicare l'attributo OverloadResolutionPriorityAttribute
ai tipi di metodo seguenti:
- Proprietà non indicizzatori
- Funzioni di accesso a proprietà, indicizzatori o eventi
- Operatori di conversione
- Espressioni lambda
- Funzioni locali
- Finalizzatori
- Costruttori statici
Inoltre, non è possibile applicare l'attributo OverloadResolutionPriorityAttribute
a un override
di un virtual
o a un membro abstract
. Il compilatore usa il valore della dichiarazione del tipo di base.