Udostępnij za pośrednictwem


Błędy i ostrzeżenia skojarzone z generatorami źródłowymi i przechwytatorami

Podczas kompilacji, gdy ładowane są generatory źródeł lub przechwytywacze, występują następujące błędy:

  • CS9137: Funkcja eksperymentalna "przechwytujących" nie jest włączona. Dodaj <Features>InterceptorsPreview</Features> do projektu.
  • CS9138: Metoda nie może być używana jako przechwytująca, ponieważ zawiera ona lub jej typ zawiera parametry typu.
  • CS9139: Nie można przechwycić: kompilacja nie zawiera pliku ze ścieżką.
  • CS9140: Nie można przechwycić: kompilacja nie zawiera pliku ze ścieżką. Czy chodziło o użycie innej ścieżki?
  • CS9141: Podany wiersz i numer znaku nie odnoszą się do nazwy metody możliwej do przechwycenia, ale raczej do tokenu.
  • CS9142: Podany plik zawiera n wiersze, które są mniejsze niż podany numer mwiersza .
  • CS9143: Podany wiersz ma długość c znaków, czyli mniejsza niż podana liczba znaków n.
  • CS9144: Nie można przechwycić metody M z przechwytnikiem V , ponieważ podpisy nie są zgodne.
  • CS9145: Nie można przechwycić: ścieżka jest niezmapowana. Oczekiwana mapowana ścieżka.
  • CS9146: Metoda przechwytywania musi być zwykłą metodą składową.
  • CS9147: Podany wiersz i numer znaku nie odnoszą się do początku tokenu. Czy chodziło o użycie wiersza n i znaku c?
  • CS9148: Interceptor musi mieć parametr pasujący do parametru this .
  • CS9149: Interceptor nie może mieć parametru this , ponieważ metoda nie ma parametru this .
  • CS9150: Interceptor nie może zawierać null ścieżki pliku.
  • CS9151: Nie można przechwycić nazwy możliwej metody M, ponieważ nie jest ona wywoływana.
  • CS9152: Nie można przechwycić wywołania w pliku przy użyciu tej ścieżki, ponieważ wiele plików w kompilacji ma tę ścieżkę.
  • CS9153: Wskazane wywołanie jest wielokrotnie przechwytywane.
  • CS9155: Nie można przechwycić wywołania za pomocą M, ponieważ nie jest ono dostępne w kontekście V.
  • CS9156: Nie można przechwycić wywołania M z V z powodu różnicy w modyfikatorach zakresu lub atrybutach [UnscopedRef].
  • CS9157: Numery linii i znaków podane do InterceptsLocationAttribute muszą być dodatnie.
  • CS9160: Nie można przechwycić operatora nameof.
  • CS9161: Nie można oznaczyć przechwytnika znakiem UnmanagedCallersOnlyAttribute.
  • CS9177: Interceptor musi być niegeneryczny lub mieć pasującą liczbę argumentów.
  • CS9178: Metoda musi być nieogólna, aby pasować
  • CS9206: Nie można zadeklarować przechwytnika w globalnej przestrzeni nazw.
  • CS9207: Nie można przechwycić, ponieważ metoda nie jest wywołaniem zwykłej metody składowej.
  • CS9231: Argument danych interceptsLocationAttribute nie jest w poprawnym formacie.
  • CS9232: Wersja "version" formatu interceptorów nie jest obsługiwana. Najnowsza obsługiwana wersja to "1".
  • CS9233: Nie można przechwycić wywołania w pliku "file", ponieważ jest zduplikowany w innym miejscu kompilacji.
  • CS9234: Nie można przechwycić wywołania w pliku "file", ponieważ pasujący plik nie został znaleziony w kompilacji.
  • CS9235: Argument danych dla InterceptsLocationAttribute odwołuje się do nieprawidłowej pozycji w pliku "file".

Podczas kompilacji, kiedy ładowane są generatory źródeł lub interceptory, są generowane następujące ostrzeżenia:

  • CS8784: Nie można zainicjować generatora "YourSourceGeneratorName". W rezultacie nie będzie on przyczyniać się do błędów danych wyjściowych i kompilacji.
  • CS8785: Generator "YourSourceGeneratorName" nie może wygenerować źródła. W rezultacie nie będzie on przyczyniać się do błędów danych wyjściowych i kompilacji.
  • CS9057: Nie można użyć zestawu analizatora, ponieważ odwołuje się do nowszej wersji kompilatora niż obecnie uruchomiona wersja.
  • CS9067: Odwołanie do analizatora określone wiele razy.
  • CS9154: Przechwytywanie wywołania M za pomocą przechwytywacza V, ale podpisy nie są zgodne.
  • CS9158: Wartość null typów odwołań w typie zwracanym nie jest zgodna z metodą przechwytywania.
  • CS9159: Wartość null typów odwołań w typie parametru nie jest zgodna z metodą przechwytywania.
  • CS9270: "InterceptsLocationAttribute(string, int, int)" nie jest obsługiwany. Zamiast tego przejdź do generowania atrybutów opartych na funkcji "InterceptableLocation". (https://github.com/dotnet/roslyn/issues/72133)

Te błędy i ostrzeżenia są zgodne z następującymi motywami:

Przechwytniki są eksperymentalne

  • CS9137: Funkcja eksperymentalna "interceptory" nie jest włączona. Dodaj <Features>InterceptorsPreview</Features> do projektu.

Aby użyć interceptorów, dodaj element w sekcji <Features>InterceptorsPreview</Features> pliku projektu (<PropertyGroup>), ponieważ interceptory są funkcją eksperymentalną, która nie jest domyślnie włączona. Wymagana jest świadoma akceptacja, ponieważ funkcja przechwytywaczy może ulec zmianom prowadzącym do niezgodności lub być usunięta w przyszłych wersjach, a kompilator potrzebuje potwierdzenia, że rozumiesz ryzyko przed zezwoleniem na jej użycie. Aby uzyskać więcej informacji na temat interceptorów i ich możliwości, zobacz Interceptory w dokumentacji funkcji języka C# 12.

Niezgodność podpisu

Następujące błędy i ostrzeżenia wskazują niezgodność między metodą przechwytywania a metodą możliwą do przechwycenia.

  • CS9144: Nie można przechwycić metody M z przechwytnikiem V , ponieważ podpisy nie są zgodne.
  • CS9148: Interceptor musi mieć parametr pasujący do parametru this .
  • CS9149: Interceptor nie może mieć parametru this , ponieważ metoda nie ma parametru this .
  • CS9155: Nie można przechwycić wywołania przy użyciu M, ponieważ nie jest dostępne w środowisku V.
  • CS9156: Nie można przejąć wywołania metody M z V z powodu różnicy w modyfikatorach zakresowych lub [UnscopedRef] atrybutach.
  • CS9177]: Interceptor musi być inny niż ogólny lub mieć pasujące arity.
  • CS9178: Metoda musi być nieuniwersalna, aby pasować

Ponadto następujące ostrzeżenia wskazują niezgodność podpisów między przechwytywaczem a przechwytywaną metodą.

  • CS9154: Przechwytywanie wywołania M za pomocą przechwytywacza V, ale sygnatury nie są zgodne.
  • CS9158: Nulowalność typów referencyjnych w typie zwracanym nie jest zgodna z przechwytywalną metodą.
  • CS9159: Nullowalność typów referencyjnych w typie parametru nie jest zgodna z metodą, którą można przechwycić.
  • CS9270: "InterceptsLocationAttribute(string, int, int)" nie jest obsługiwany. Zamiast tego przejdź do generowania atrybutów opartych na funkcji "InterceptableLocation". (https://github.com/dotnet/roslyn/issues/72133)

Aby rozwiązać te problemy, upewnij się, że metoda przechwytująca jest zgodna z podpisem i wymaganiami dostępu metody przechwytywalnej.

  • Upewnij się, że sygnatura metody przechwytywania dokładnie odpowiada metodzie przechwytywania (CS9144, CS9154). Typy parametrów, modyfikatory, kolejność i typ zwracany muszą być identyczne. Przejrzyj zarówno deklaracje metod, jak i dopasuj ich sygnatury.
  • this Dodaj parametr do twojego przechwytywacza, gdy metoda, którą można przechwycić, jest metodą instancyjną (CS9148), lub usuń parametr this, gdy metoda, którą można przechwycić, jest statyczna (CS9149). Przechwytywacze instancji wymagają this parametru typu deklarującego, podczas gdy statyczne przechwytywacze nie mogą mieć tego parametru.
  • Zadeklaruj przechwytywanie w lokalizacji, w której metoda przechwycona jest dostępna (CS9155). Jeśli metoda, którą można przechwycić, to internal, przechwytywacz musi znajdować się w tej samej bibliotece. Jeśli jest to private, interceptor musi być w tym samym typie lub w typie zagnieżdżonym.
  • Dopasuj scoped modyfikatory i [UnscopedRef] atrybuty na odpowiednich ref parametrach (CS9156). Każdy parametr ref w interceptorze musi mieć takie same adnotacje czasu istnienia jak odpowiedni parametr w metodzie przechwytywanej, aby zapewnić bezpieczeństwo pamięci.
  • Upewnij się, że obie metody mają pasującą liczbę parametrów ogólnych (CS9177, CS9178). Jeśli metoda możliwa do przechwycenia jest niegeneryczna, przechwytywacz musi być również niegeneryczny. Jeśli metoda, którą można przechwycić, ma parametry typu, przechwytujący musi mieć taką samą liczbę parametrów typu z zgodnymi ograniczeniami.
  • Dopasuj adnotacje dla wartości null w typie zwracanym (CS9158) i typach parametrów (CS9159). Włącz typy referencyjne dopuszczane do wartości null w projekcie i upewnij się, że adnotacje o wartości null przechwytywania są zgodne z metodą przechwytalną dokładnie w celu zachowania bezpieczeństwa typu.
  • Użyj zaktualizowanej InterceptableLocation generacji opartej na InterceptsLocationAttribute zamiast przestarzałego konstruktora (string, int, int) (CS9270). Nowszy format zapewnia lepszą obsługę narzędzi i walidację czasu kompilacji. Zobacz zgłoszenie GitHub , aby uzyskać wskazówki dotyczące migracji.

Nieprawidłowe mapowanie

Przechwytniki wymagają mapowania źródła mapowania metody przechwytowalnej i metody przechwytywania. Następujące błędy wskazują problem z mapowaniem:

  • CS9139: Nie można przechwycić: kompilacja nie zawiera pliku ze ścieżką.
  • CS9140: Nie można przechwycić: kompilacja nie zawiera pliku ze ścieżką. Czy chodziło o użycie innej ścieżki?
  • CS9141: Podany wiersz i numer znaku nie odnoszą się do nazwy metody możliwej do przechwycenia, ale raczej do tokenu.
  • CS9142: Podany plik zawiera n wiersze, które są mniejsze niż podany numer mwiersza .
  • CS9143: Podany wiersz zawiera c znaków, co jest mniej niż przewidziana liczba n znaków.
  • CS9145: Nie można przechwycić: ścieżka jest niezmapowana. Oczekiwana jest zmapowana ścieżka.
  • CS9147: Podany wiersz i numer znaku nie odnoszą się do początku tokenu. Czy chodziło o użycie wiersza n i znaku c?
  • CS9150: Interceptujący nie może mieć null ścieżki pliku.
  • CS9157: Liczby wierszy i znaków podane do InterceptsLocationAttribute muszą być dodatnie.

Aby poprawić błędy mapowania, upewnij się, że twój InterceptsLocationAttribute zawiera prawidłowe ścieżki plików i dokładne informacje o pozycji.

  • Sprawdź, czy ścieżka pliku pasuje do pliku w kompilacji dokładnie (CS9139, CS9140). Użyj dokładnej ścieżki tak, jak wyświetlana jest w projekcie, w tym prawidłowej wielkości liter i separatorów katalogów. Jeśli kompilator sugeruje alternatywną ścieżkę, zaktualizuj atrybut tak, aby używał tej ścieżki.
  • Użyj mapowanych ścieżek plików podczas pracy z generatorami źródłowymi, które przekształcają ścieżki plików (CS9145). Generatory źródeł często ponownie mapują ścieżki dla wygenerowanych plików, a należy użyć zmapowanej ścieżki rozpoznawanej przez kompilator, a nie oryginalnej ścieżki źródłowej.
  • Upewnij się, że ścieżka pliku nie jest null w InterceptsLocationAttribute (CS9150). Każde przechwycenie musi określać prawidłową ścieżkę pliku o wartości innej niż null, która identyfikuje plik źródłowy zawierający wywołanie przechwytywania.
  • Podaj dodatnie numery wierszy i znaków z początkiem od 1 (CS9157). Numery wierszy i pozycje znaków muszą zaczynać się od 1, a nie 0. Sprawdź, czy generator źródła używa indeksowania opartego na 1 podczas obliczania pozycji.
  • Wskaż dokładny początek tokenu nazwy metody (CS9141, CS9147). Numery wierszy i znaków muszą identyfikować pierwszy znak nazwy metody w wywołaniu, a nie spację, operatory lub inne tokeny. Jeśli kompilator sugeruje alternatywne współrzędne, użyj ich, aby kierować się na prawidłowy początek tokenu.
  • Pozostań w granicach pliku (CS9142, CS9143). Sprawdź, czy numer wiersza nie przekracza całkowitej liczby wierszy, a liczba znaków nie przekracza długości wiersza. Oblicz ponownie pozycje, jeśli plik źródłowy uległ zmianie od czasu wygenerowania atrybutu.

Nieprawidłowa deklaracja interceptora

Następujące błędy wskazują problemy z deklaracjami przechwytywania, w tym problemy z formatem InterceptsLocationAttribute lub naruszeniami reguł przechwytywania:

  • CS9138: Metody nie można używać jako interceptora, ponieważ ona lub jej typ zawiera parametry typu.
  • CS9146: Metoda przechwytywania musi być zwykłą metodą składową.
  • CS9151: Nie można przechwycić nazwy potencjalnej metody M, ponieważ nie jest wywoływana.
  • CS9152: Nie można przechwycić wywołania w pliku przy użyciu tej ścieżki, ponieważ wiele plików w kompilacji ma tę ścieżkę.
  • CS9153: Wskazane wywołanie jest przechwytywane/interceptowane wiele razy.
  • CS9160: Nie można przechwycić operatora nameof.
  • CS9161: Nie można oznaczyć przechwytnika znakiem UnmanagedCallersOnlyAttribute.
  • CS9206: Nie można zadeklarować przechwytnika w globalnej przestrzeni nazw.
  • CS9207: Nie można przechwycić, ponieważ metoda nie jest wywołaniem zwykłej metody składowej.
  • CS9231: Argument danych dla InterceptsLocationAttribute nie jest w poprawnym formacie.
  • CS9232: Wersja "version" formatu interceptorów nie jest obsługiwana. Najnowsza obsługiwana wersja to "1".
  • CS9233: Nie można przechwycić wywołania w pliku "file", ponieważ jest zduplikowane w innym miejscu kompilacji.
  • CS9234: Nie można przechwycić wywołania w pliku "file", ponieważ pasujący plik nie został znaleziony w kompilacji.
  • CS9235: Argument danych "InterceptsLocationAttribute" odnosi się do nieprawidłowej pozycji w pliku 'file'.

Aby poprawić błędy deklaracji przechwytywania, postępuj zgodnie z następującymi regułami dotyczącymi prawidłowych deklaracji przechwytywania i InterceptsLocationAttribute użycia:

  • Poprawnie sformatuj InterceptsLocationAttribute argument danych (CS9231). Atrybut wymaga specjalnie ustrukturyzowanych danych, które koduje ścieżkę pliku i informacje o pozycji. Upewnij się, że generator źródłowy generuje dane w oczekiwanym formacie zgodnym ze specyfikacją obecnych interceptorów.
  • Użyj wersji "1" w pliku InterceptsLocationAttribute (CS9232), ponieważ jest to najnowsza obsługiwana wersja. Zaktualizuj generator źródła, aby generował atrybuty w formacie wersji 1 zamiast nieobsługiwanych numerów wersji.
  • Upewnij się, że ścieżki plików w kompilacji są unikatowe (CS9233, CS9234). Gdy kompilacja zawiera zduplikowane ścieżki plików, zmień nazwę lub zreorganizowanie plików, aby każda ścieżka została unikatowa. Sprawdź, czy ścieżka pliku w atrybucie jest zgodna z plikiem zawartym w kompilacji.
  • Zweryfikuj dane dotyczące pozycji względem poprawnych lokalizacji kodu (CS9235). Numery wierszy i znaków muszą odwoływać się do prawidłowego punktu przechwytywania w określonym pliku. Wygeneruj ponownie atrybut, jeśli plik źródłowy uległ zmianie lub jeśli pozycja wykracza poza granice pliku.
  • Zadeklaruj niegeneryczne metody interceptorów w typach niegenerycznych (CS9138). Przechwytywacze nie mogą mieć parametrów typu w samej metodzie ani w ich typie zawierającym. Jeśli chcesz przechwycić metodę ogólną, utwórz niegeneryczny interceptor, który współpracuje z konkretnym utworzonym typem.
  • Uczyń interceptory zwykłymi metodami składowymi (CS9146). Przechwytywacze nie mogą być operatorami, konstruktorami, finalizatorami, właściwościami ani indeksatorami. Zadeklaruj swój interceptor jako regularną metodę statyczną lub metodę instancji.
  • Przechwyć wywołania metod rzeczywistych, a nie wyrażeń (CS9151, CS9207). Można przechwytywać wywołania tylko do zwykłych metod składowych, które są wywoływane. Nie można przechwytywać grup metod, delegatów ani metod, do których jest odwołanie bez ich wywołania. Upewnij się, że lokalizacja przechwycona identyfikuje rzeczywiste wywołanie metody.
  • Usuń zduplikowane próby przechwycenia (CS9153). Każde wywołanie metody można przechwycić tylko raz. Jeśli wiele InterceptsLocationAttribute wystąpień dotyczy tego samego wywołania, usuń wszystkie oprócz jednego, aby rozwiązać niejednoznaczność.
  • Nie przechwytuj nameof operatorów (CS9160). Operator nameof nie wywołuje metod w czasie wykonywania, więc nie można go przechwycić. Przechwytuje tylko rzeczywiste wywołania metod, które są wykonywane podczas działania programu.
  • Usuń UnmanagedCallersOnlyAttribute z interceptorów (CS9161). Przechwytniki muszą być wywoływane z kodu zarządzanego i nie można ich oznaczyć za pomocą polecenia UnmanagedCallersOnlyAttribute. Usuń atrybut z deklaracji metody interceptor.
  • Zadeklaruj przechwytniki w przestrzeni nazw (CS9206). Przechwytywacze nie mogą być zadeklarowane w globalnej przestrzeni nazw i muszą być zawarte w co najmniej jednej deklaracji przestrzeni nazw. Opakuj klasę interceptera w przestrzeni nazw.
  • Rozwiąż zduplikowane ścieżki plików na poziomie kompilacji (CS9152). Jeśli wiele plików współużytkuje tę samą ścieżkę w kompilacji, kompilator nie może określić, który plik ma zostać przechwycony. Upewnij się, że konfiguracja kompilacji tworzy unikatowe ścieżki plików lub użyj innej strategii organizacji dla plików źródłowych.

Zgodność analizatora

Następujące ostrzeżenia wskazują problemy z analizatorem lub zestawami generatora źródła:

  • CS9057: Nie można użyć zestawu analizatora, ponieważ odwołuje się do nowszej wersji kompilatora niż obecnie uruchomiona wersja.
  • CS9067: Odwołanie do analizatora określone wiele razy.

Te ostrzeżenia występują, gdy występują problemy ze zgodnością z zestawami analizatorów:

  • CS9057 jest generowany, gdy zestaw analizatora odwołuje się do wersji kompilatora Roslyn nowszej niż aktualnie uruchomiona. Uniemożliwia to ładowanie analizatora, ponieważ może on zależeć od interfejsów API lub zachowań, które nie są dostępne w bieżącej wersji kompilatora. Aby rozwiązać ten problem, uaktualnij kompilator/zestaw SDK w celu dopasowania do wymagań analizatora lub użyj wersji analizatora zgodnej z bieżącą wersją kompilatora.
  • CS9067 ostrzega, gdy ten sam zestaw analizatora jest przywołyny wiele razy w projekcie. Zwykle dzieje się tak, gdy analizator jest dołączany przez wiele ścieżek lub odwołań do pakietu. Chociaż nie jest to błąd, zduplikowane odwołania mogą mieć wpływ na wydajność kompilacji i mogą powodować nieoczekiwane zachowanie. Usuń zduplikowane odwołania, aby rozwiązać to ostrzeżenie.