Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
nwiersze, które są mniejsze niż podany numermwiersza . -
CS9143: Podany wiersz ma długość
cznaków, czyli mniejsza niż podana liczba znakówn. -
CS9144: Nie można przechwycić metody
Mz przechwytnikiemV, 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
ni znakuc? -
CS9148: Interceptor musi mieć parametr pasujący do parametru
this. -
CS9149: Interceptor nie może mieć parametru
this, ponieważ metoda nie ma parametruthis. -
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ścieV. -
CS9156: Nie można przechwycić wywołania
MzVz powodu różnicy w modyfikatorach zakresu lub atrybutach[UnscopedRef]. -
CS9157: Numery linii i znaków podane do
InterceptsLocationAttributemuszą 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
Mza pomocą przechwytywaczaV, 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
Mz przechwytnikiemV, 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 parametruthis. -
CS9155: Nie można przechwycić wywołania przy użyciu
M, ponieważ nie jest dostępne w środowiskuV. -
CS9156: Nie można przejąć wywołania metody
MzVz 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
Mza pomocą przechwytywaczaV, 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.
-
thisDodaj parametr do twojego przechwytywacza, gdy metoda, którą można przechwycić, jest metodą instancyjną (CS9148), lub usuń parametrthis, gdy metoda, którą można przechwycić, jest statyczna (CS9149). Przechwytywacze instancji wymagająthisparametru 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 toprivate, interceptor musi być w tym samym typie lub w typie zagnieżdżonym. - Dopasuj
scopedmodyfikatory i[UnscopedRef]atrybuty na odpowiednichrefparametrach (CS9156). Każdy parametrrefw 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
InterceptableLocationgeneracji opartej naInterceptsLocationAttributezamiast 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
nwiersze, które są mniejsze niż podany numermwiersza . -
CS9143: Podany wiersz zawiera
cznaków, co jest mniej niż przewidziana liczbanznakó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
ni znakuc? -
CS9150: Interceptujący nie może mieć
nullścieżki pliku. -
CS9157: Liczby wierszy i znaków podane do
InterceptsLocationAttributemuszą 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
nullwInterceptsLocationAttribute(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
InterceptsLocationAttributeargument 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
InterceptsLocationAttributewystąpień dotyczy tego samego wywołania, usuń wszystkie oprócz jednego, aby rozwiązać niejednoznaczność. - Nie przechwytuj
nameofoperatorów (CS9160). Operatornameofnie 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ń
UnmanagedCallersOnlyAttributez interceptorów (CS9161). Przechwytniki muszą być wywoływane z kodu zarządzanego i nie można ich oznaczyć za pomocą poleceniaUnmanagedCallersOnlyAttribute. 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.