Rozwiąż błędy i ostrzeżenia wpływające na rozwiązanie przeciążenia.
W tym artykule opisano następujące błędy kompilatora:
- Operator CS0034 jest niejednoznaczny na operandach typu "
type1
" i "type2
" - - Operator CS0035 - jest niejednoznaczny na operandie typu "type"
- Typ CS0111 - definiuje już składową o nazwie "name" z tymi samymi typami parametrów
- CS0121 - Wywołanie jest niejednoznaczne między następującymi metodami lub właściwościami
- CS0457 - Niejednoznaczne konwersje zdefiniowane przez użytkownika podczas konwertowania z "type1" na "type2"
- CS0663 - Nie można zdefiniować metod przeciążonych, które różnią się tylko w systemach
ref
iout
. - CS1007 - — Już zdefiniowano metodę dostępu właściwości
- Oczekiwano operatora jednoargumentowego z możliwością przeciążenia CS1019 -
- Oczekiwany operator binarny CS1020 - z możliwością przeciążenia
- CS1501 - Brak przeciążenia metody "method" przyjmuje argumenty "number"
- Cs1534 - Przeciążony operator binarny "operator" przyjmuje dwa parametry
- Cs1535 - Przeciążony operator jednoargumentowy "operator" przyjmuje jeden parametr
- CS1928 - "Type" nie zawiera definicji metody " i najlepsze przeciążenie metody rozszerzenia "method" ma kilka nieprawidłowych argumentów.
- CS1929 - "TypeA" nie zawiera definicji metody "method" i najlepsze przeciążenie metody rozszerzenia "TypeB.method" wymaga odbiornika typu "TypeC"
- Operator CS8315 - jest niejednoznaczny na operandach
- CS9261 - Nie można użyć elementu "
OverloadResolutionPriorityAttribute
" w zastępowanym elemencie członkowskim. - CS9262 - Nie można użyć elementu "
OverloadResolutionPriorityAttribute
" w tym elemencie członkowskim.
Ponadto następujące ostrzeżenie kompilatora:
- CS3006 - Przeciążona metoda "method" różni się tylko w
ref
klasy lubout
lub w klasyfikacji tablicy, nie jest zgodna ze specyfikacją CLS
Nieprawidłowa definicja przeciążenia
- CS0663 - Nie można zdefiniować metod przeciążonych, które różnią się tylko w systemach
ref
iout
. - Oczekiwano operatora jednoargumentowego z możliwością przeciążenia CS1019 -
- Oczekiwany operator binarny CS1020 - z możliwością przeciążenia
- Cs1534 - Przeciążony operator binarny "operator" przyjmuje dwa parametry
- Cs1535 - Przeciążony operator jednoargumentowy "operator" przyjmuje jeden parametr
Ponadto następujące ostrzeżenie kompilatora:
- CS3006 - Przeciążona metoda "method" różni się tylko w
ref
klasy lubout
lub w klasyfikacji tablicy, nie jest zgodna ze specyfikacją CLS
Podczas tworzenia przeciążonych operatorów w klasie podpis musi odpowiadać liczbie parametrów wymaganych dla tego operatora. Nieprawidłowa liczba parametrów w definicji operatora.
Ponadto operatory przeciążenia muszą używać zdefiniowanej nazwy operatora. Jedynym wyjątkiem jest utworzenie operatora konwersji, w którym nazwa operatora jest zgodna z zwracanym typem konwersji.
Zdefiniowane zduplikowane przeciążenia
- Typ CS0111 - definiuje już składową o nazwie "name" z tymi samymi typami parametrów
- CS1007 - — Już zdefiniowano metodę dostępu właściwości
Te błędy wskazują, że utworzono przeciążenia, które nie różnią się. Typowe przyczyny:
- Pasujące typy parametrów mają konwersję tożsamości. Na przykład
M(dynamic)
i ,M(object)
lubM2(string)
iM2(string?)
. - Pasujące typy parametrów różnią się tylko modyfikatorem odwołań. Przykład:
M(ref int)
iM(out int)
. - Dołączono zarówno metodę
set
dostępu, jakinit
i dla właściwości.
Nie znaleziono przeciążenia
- CS1501 - Brak przeciążenia metody "method" przyjmuje argumenty "number"
- CS1928 - "Type" nie zawiera definicji metody " i najlepsze przeciążenie metody rozszerzenia "method" ma kilka nieprawidłowych argumentów.
- CS1929 - "TypeA" nie zawiera definicji metody "method" i najlepsze przeciążenie metody rozszerzenia "TypeB.method" wymaga odbiornika typu "TypeC"
Kod wywołuje metodę, w której istnieje nazwa, ale niektóre argumenty są niepoprawne lub użyto nieprawidłowej liczby argumentów. Jeśli próbujesz wywołać metodę rozszerzenia, klasa zawierająca może znajdować się w przestrzeni nazw, która nie jest importowana.
Uwaga
Błąd CS1928
nie jest używany przez najnowsze kompilatory. Nowsze kompilatory używają CS1929
wyłącznie.
Niejednoznaczne przeciążenia
- Operator CS0034 - jest niejednoznaczny na operandach typu "
type1
" i "type2
" - Operator CS0035 - jest niejednoznaczny na operandie typu "type"
- CS0121 - Wywołanie jest niejednoznaczne między następującymi metodami lub właściwościami
- CS0457 - Niejednoznaczne konwersje zdefiniowane przez użytkownika podczas konwertowania z "type1" na "type2"
- Operator CS8315 - jest niejednoznaczny na operandach
Te błędy wskazują, że nie ma jednego lepszego przeciążenia niż inne. Istnieje kilka możliwych przyczyn tych błędów:
Różne argumenty są lepsze dla każdego parametru. Jeden może być dokładnym dopasowaniem, a drugi wymaga konwersji:
void M(int a, double b) { } void M(double a, int b) {} M(1, 1); // ambiguous
Istnieje wiele operatorów konwersji zdefiniowanych przez użytkownika. Operatory konwersji można zadeklarować w typie źródłowym, jego typie podstawowym, typie docelowym lub typie podstawowym. Jeśli operator konwersji został zdefiniowany w więcej niż jednym, kompilator nie może wybrać.
Wielu operatorów konwersji może wykonać zgodną konwersję.
Co najmniej jeden argument używa
default
(niedefault(T)
) i można wybrać wiele typów.
W większości przypadków dodanie jawnego rzutowania może określić, które przeciążenie należy wybrać.
Priorytet rozpoznawania przeciążenia
- CS9261 - Nie można użyć elementu "
OverloadResolutionPriorityAttribute
" w zastępowanym elemencie członkowskim. - CS9262 - Nie można użyć elementu "
OverloadResolutionPriorityAttribute
" w tym elemencie członkowskim.
Kod naruszył reguły używania OverloadResolutionPriorityAttribute elementu do faworyzowania jednego przeciążenia zamiast innego. Nie można zastosować elementu OverloadResolutionPriorityAttribute
do następujących typów metod:
- Właściwości nieindeksatora
- Metody dostępu do właściwości, indeksatora lub zdarzenia
- Operatory konwersji
- Lambdas
- Funkcje lokalne
- Finalizatory
- Konstruktory statyczne
Ponadto nie można zastosować elementu OverloadResolutionPriorityAttribute
do elementu override
virtual
lub abstract
elementu członkowskiego. Kompilator używa wartości z deklaracji typu podstawowego.