Udostępnij za pośrednictwem


Rozwiąż błędy i ostrzeżenia wpływające na rozwiązanie przeciążenia.

W tym artykule opisano następujące błędy kompilatora:

Ponadto następujące ostrzeżenie kompilatora:

  • CS3006 - Przeciążona metoda "method" różni się tylko w ref klasy lub outlub 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 i out.
  • 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 lub outlub 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)lub M2(string) i M2(string?).
  • Pasujące typy parametrów różnią się tylko modyfikatorem odwołań. Przykład: M(ref int) i M(out int).
  • Dołączono zarówno metodę set dostępu, jak init 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 (nie default(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.