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.
W przypadku naruszenia reguł bezpieczeństwa zmiennych referencyjnych można wygenerować następujące błędy:
-
CS8166: Nie można zwrócić parametru przez odwołanie, ponieważ nie
refjest to parametr -
CS8167: Nie można zwrócić przez odwołanie do elementu członkowskiego parametru, ponieważ nie
refjest to parametr lubout - CS8168: Nie można zwrócić lokalnego przez odwołanie, ponieważ nie jest to lokalne odwołanie
- CS8169: Nie można zwrócić elementu członkowskiego zmiennej lokalnej przez odwołanie, ponieważ nie jest to element lokalny ref
-
CS8345: Pole lub właściwość automatycznie zaimplementowana nie może być tego typu, chyba że jest członkiem instancji
ref structklasy. -
CS8351: Gałęzie operatora warunkowego
refnie mogą odwoływać się do zmiennych z niezgodnymi zakresami deklaracji - CS8374: Nie można przypisać źródła ref-assign ma węższy zakres ucieczki niż miejsce docelowe.
- CS9075: Nie można zwrócić parametru przez referencję, ponieważ należy do zakresu bieżącej metody
- CS9076: Nie można zwrócić przez referencję członka parametru, ponieważ jest ograniczony do bieżącej metody
-
CS9077: Nie można zwrócić parametru za pomocą odwołania za pośrednictwem parametru
ref; można go zwrócić tylko w instrukcji return -
CS9078: Nie można zwrócić przez odwołanie do elementu członkowskiego parametru za pomocą parametru
ref; można go zwrócić tylko w instrukcji return - CS9079: Nie można przypisać źródła ref-assign do miejsca docelowego, ponieważ źródło może uniknąć bieżącej metody tylko za pomocą instrukcji return.
- CS9096: Nie można przypisać źródła ref-assign do miejsca docelowego, ponieważ źródło ma szerszy zakres ucieczki wartości niż miejsce docelowe zezwalające na przypisanie za pośrednictwem lokalizacji docelowej wartości z węższymi zakresami ucieczki niż źródło.
W przypadku naruszenia reguł bezpieczeństwa zmiennych referencyjnych są generowane następujące ostrzeżenia:
- CS9080: Użycie zmiennej w tym kontekście może uwidocznić zmienne poza zakresem deklaracji
- CS9081: Wynik wyrażenia stackalloc typu w tym kontekście może być uwidoczniony poza zawierającą się metodą
- CS9082: Lokalna zmienna jest zwracana przez odwołanie, ale została zainicjowana wartością, której nie można zwrócić przez odwołanie
- CS9083: Element członkowski jest zwracany przez odwołanie, ale został zainicjowany na wartość, której nie można zwrócić przy użyciu odwołania
- CS9084: Składowa struktury zwraca element członkowski 'this' lub inne elementy członkowskie instancji przez odniesienie
- CS9085: Ten element ref przypisuje źródło do miejsca docelowego, ale źródło ma węższy zakres ucieczki niż miejsce docelowe.
- CS9086: Gałęzie operatora warunkowego ref odwołują się do zmiennych z niezgodnymi zakresami deklaracji
-
CS9087: Zwraca parametr według odwołania, ale nie jest parametrem
ref - CS9088: Zwraca parametr według odwołania, ale jest on ograniczony do bieżącej metody
-
CS9089: Zwraca to odwołanie do elementu członkowskiego parametru, który nie jest parametrem
reflubout - CS9090: Jest to zwracane jako referencja do elementu parametru, który znajduje się w zakresie bieżącej metody
- CS9091: Zwraca wartość lokalną przez odwołanie, ale nie jest to lokalne odwołanie
- CS9092: Zwraca element członkowski lokalnego przez odwołanie, ale nie jest to element lokalny ref
- CS9093: ten element ref przypisuje źródło do miejsca docelowego, ale źródło może uniknąć bieżącej metody tylko za pomocą instrukcji return.
-
CS9094: Zwraca parametr przez odwołanie za pośrednictwem parametru
ref, ale można go bezpiecznie zwrócić tylko w instrukcji return -
CS9095: Zwraca to odwołanie do elementu członkowskiego parametru za pomocą parametru
ref, ale można go bezpiecznie zwrócić tylko w instrukcji return - CS9097: Ten element ref przypisuje źródło do miejsca docelowego, ale źródło ma szerszy zakres ucieczki wartości niż miejsce docelowe zezwalające na przypisanie za pośrednictwem miejsca docelowego wartości z węższymi zakresami ucieczki niż źródło.
Zwracanie odwołań z niezgodnymi zakresami
Kompilator uniemożliwia zwracanie odwołania do zmiennej, gdy okres istnienia zmiennej nie wykracza poza zakres metody. Te błędy występują podczas próby zwrócenia przez referencję parametru, zmiennej lokalnej lub członka, który nie jest zadeklarowany z ref lub ma zakres ograniczony do bieżącej metody.
Błędy:
-
CS8166: Nie można zwrócić parametru przez odwołanie, ponieważ nie
refjest to parametr -
CS8167: Nie można zwrócić przez odwołanie do elementu członkowskiego parametru, ponieważ nie
refjest to parametr lubout - CS8168: Nie można zwrócić lokalnego przez odwołanie, ponieważ nie jest to lokalne odwołanie
- CS8169: Nie można zwrócić elementu członkowskiego zmiennej lokalnej przez odwołanie, ponieważ nie jest to element lokalny ref
- CS9075: Nie można zwrócić parametru według odwołania, ponieważ jest on w zakresie bieżącej metody
- CS9076: Nie można zwrócić przez odwołanie elementu członkowskiego parametru, ponieważ jego zakres ogranicza się do bieżącej metody
-
CS9077: Nie można zwrócić parametru za pomocą odwołania za pośrednictwem parametru
ref; można go zwrócić tylko w instrukcji return -
CS9078: Nie można zwrócić przez odwołanie do elementu członkowskiego parametru za pomocą parametru
ref; można go zwrócić tylko w instrukcji return
Ostrzeżenia:
-
CS9087: Zwraca parametr według odwołania, ale nie jest parametrem
ref - CS9088: Zwraca parametr przekazany przez odwołanie, ale jego zakres jest ograniczony do bieżącej metody
-
CS9089: Zwraca to odwołanie do elementu członkowskiego parametru, który nie jest parametrem
reflubout - CS9090: To odwołanie zwraca członka parametru związanego z bieżącą metodą
- CS9091: Zwraca wartość lokalną przez odwołanie, ale nie jest to lokalne odwołanie
- CS9092: Zwraca element członkowski lokalnego przez odwołanie, ale nie jest to element lokalny ref
-
CS9094: Zwraca parametr przez odwołanie za pośrednictwem parametru
ref, ale można go bezpiecznie zwrócić tylko w instrukcji return -
CS9095: Zwraca to odwołanie do elementu członkowskiego parametru za pomocą parametru
ref, ale można go bezpiecznie zwrócić tylko w instrukcji return
Aby rozwiązać te błędy:
- Zmień sygnaturę metody, aby zadeklarować parametry za pomocą słowa kluczowego
refzamiast przekazywać je według wartości, co umożliwia bezpieczne zwrócenie lokalizacji przechowywania parametru, ponieważ obiekt wywołujący kontroluje okres istnienia zmiennej (CS8166, CS8167,CS9087, CS9089). - W przypadku zmiennych lokalnych zadeklaruj je jako
reflokalne, przypisując je z wyrażenia zwracającego ref lub parametru ref. Zapewnia to, że zmienna lokalna odnosi się do pamięci z wystarczająco długim czasem życia, zamiast tworzyć nową zmienną z czasem życia ograniczonym do zakresu metody (CS8168, CS8169, CS9091, CS9092). - Gdy parametr jest zadeklarowany za pomocą
scopedmodyfikatora, należy unikać zwracania go przez odwołanie, ponieważscopedmodyfikator jawnie ogranicza odwołanie parametru do ucieczki od metody, uniemożliwiając potencjalne zwisające odwołania (CS9075, CS9076, CS9088, CS9090). - Jeśli musisz zwrócić odwołanie pochodzące z parametru
ref, użyj instrukcji bezpośredniejreturn ref, a nie przypisania odwołania do innegorefparametru i zwrócenia go, ponieważ kompilator może śledzić zakres ucieczki tylko za pomocą bezpośrednich instrukcji zwrotu (CS9077, CS9078, CS9094, CS9095).
Aby uzyskać więcej informacji na temat reguł bezpieczeństwa ref, zobacz artykuł dotyczący zwrotów ref i standardowa sekcja języka C# dotycząca kontekstów awaryjnych ref.
Przypisania "ref" o niezgodnych zakresach
Kompilator uniemożliwia operacje przypisania ref, w których zmienna źródłowa ma węższy zakres ucieczki niż miejsce docelowe. Przypisanie ref tworzy odwołanie z lokalizacji docelowej do lokalizacji przechowywania źródła. Jeśli źródło może wyjść z zakresu przed miejscem docelowym, miejsce docelowe odwołuje się do nieprawidłowej pamięci.
Błędy:
- CS8374: Nie można przypisać źródła ref-assign ma węższy zakres ucieczki niż miejsce docelowe.
- CS9079: Nie można przypisać źródła ref-assign do miejsca docelowego, ponieważ źródło może uniknąć bieżącej metody tylko za pomocą instrukcji return.
- CS9096: Nie można przypisać źródła ref-assign do miejsca docelowego, ponieważ źródło ma szerszy zakres ucieczki wartości niż miejsce docelowe zezwalające na przypisanie za pośrednictwem lokalizacji docelowej wartości z węższymi zakresami ucieczki niż źródło.
Ostrzeżenia:
- CS9085: Ten element ref przypisuje źródło do miejsca docelowego, ale źródło ma węższy zakres ucieczki niż miejsce docelowe.
- CS9093: ten element ref przypisuje źródło do miejsca docelowego, ale źródło może uniknąć bieżącej metody tylko za pomocą instrukcji return.
- CS9097: Ten element ref przypisuje źródło do miejsca docelowego, ale źródło ma szerszy zakres ucieczki wartości niż miejsce docelowe zezwalające na przypisanie za pośrednictwem miejsca docelowego wartości z węższymi zakresami ucieczki niż źródło.
Aby rozwiązać te błędy:
- Zmień strukturę kodu, aby zmienna źródłowa w przypisaniu ref miała zakres ucieczki co najmniej tak szeroki, jak zmienna docelowa, co zapewnia, że odwołanie docelowe pozostaje prawidłowe przez cały okres istnienia i zapobiega zwisaniu odwołań (CS8374, CS9085).
- Jeśli zmienna może wydostać się z metody tylko za pomocą instrukcji return, nie przypisuj jej do zmiennych dostępnych innymi sposobami. Przykłady obejmują przechowywanie w polach lub zwracanie za pomocą parametrów ref. Te akcje naruszają ograniczenie, że źródło może być używane tylko w instrukcjach zwrotnych (CS9079, CS9093).
- W przypadku przypisań ref obejmujących zakresy ucieczki wartości upewnij się, że zakres ucieczki wartości źródła nie jest szerszy niż zakres docelowy, ponieważ niezgodność umożliwia przypisanie wartości o węższym zakresie za pośrednictwem odniesienia docelowego, co może prowadzić do tworzenia odwołań do wartości krótkotrwałych (CS9096, CS9097).
Aby uzyskać więcej informacji na temat reguł bezpieczeństwa ref, zobacz artykuł dotyczący zwrotów ref i standardowa sekcja języka C# dotycząca kontekstów awaryjnych ref.
Naruszenia zakresu ucieczki i operatory warunkowe
Kompilator śledzi, jak zmienne mogą uniknąć zakresu deklaracji za pomocą różnych operacji. Podczas używania zmiennych w kontekstach, które mogą ujawniać zmienne referencyjne poza ich prawidłowym okresem istnienia, w tym za pomocą operatorów warunkowych ref i wyrażeń stackalloc, występują błędy.
Błędy:
-
CS8351: Gałęzie operatora warunkowego
refnie mogą odwoływać się do zmiennych z niezgodnymi zakresami deklaracji
Ostrzeżenia:
- CS9080: Użycie zmiennej w tym kontekście może uwidocznić zmienne poza zakresem deklaracji
- CS9081: Wynik wyrażenia stackalloc typu w tym kontekście może być uwidoczniony poza zawierającą się metodą
- CS9086: Gałęzie operatora warunkowego ref odwołują się do zmiennych z niezgodnymi zakresami deklaracji
Aby rozwiązać te błędy:
- Zmodyfikuj operator warunkowy ref (
?:operator zrefzwracającym), tak aby zarówno gałęzie true, jak i false odwoływały się do zmiennych, które mają zgodne zakresy deklaracji, co oznacza, że oba zmienne muszą mieć okresy istnienia, które obejmują przynajmniej ten sam poziom zakresu, uniemożliwiając wyrażeniu warunkowemu potencjalne zwrócenie odwołania, które staje się nieprawidłowe (CS8351, CS9086). - W przypadku używania zmiennych w wyrażeniach lub wywołaniach metod upewnij się, że kontekst nie zezwala na ucieczkę zmiennych referencyjnych poza zakres ich deklaracji, co zazwyczaj oznacza, że należy unikać przekazywania zmiennych o określonym zakresie do metod lub wyrażeń, w których mogą być zachowane lub przechowane poza ich zamierzonym okresem życia (CS9080).
- W przypadku wyrażeń stackalloc należy unikać przypisywania wyniku do zmiennych lub używania go w kontekstach, w których można uzyskać dostęp do pamięci przydzielonej na stosie poza metodą zawierającą to wyrażenie, ponieważ pamięć ta jest automatycznie zwalniana po zakończeniu działania metody, a dostęp do niej po jej zakończeniu powoduje niezdefiniowane zachowanie (CS9081).
Aby uzyskać więcej informacji, zobacz artykuł na temat zwrotów ref, artykuł dotyczący użycia pamięci i standardowa sekcja języka C# dotycząca kontekstów bezpiecznego ref.
Ograniczenia członków i pól struktury
Kompilator wymusza specjalne reguły dla składowych i pól struktury, aby zapobiec wiszącym odwołaniom. Te błędy występują, gdy elementy członkowskie struktury zwracają referencje do stanu wystąpienia lub gdy pola mają typy wymagające specjalnej obsługi.
Błędy:
-
CS8345: Właściwość pola lub zaimplementowana automatycznie nie może być typu, chyba że jest członkiem wystąpienia
ref structklasy .
Ostrzeżenia:
- CS9082: Obiekt lokalny jest zwracany przez odwołanie, ale został zainicjowany na wartość, której nie można zwrócić przez odwołanie
- CS9083: Członek jest zwracany przez odwołanie, ale został zainicjowany do wartości, której nie można zwrócić przez odwołanie
- CS9084: Składowa struktury zwraca 'this' lub inne elementy instancji przez odwołanie
Aby rozwiązać te błędy:
- Upewnij się, że pola i automatycznie implementowane właściwości z typami ref-like (takimi jak typy
Span<T>lubref struct) są deklarowane tylko jako elementy członkowskie instancji w ramach typu ref struct, a nie w zwykłych struct lub klasach, ponieważ typy podobne do ref mogą bezpiecznie istnieć tylko na stosie, a ref struct zapewnia niezbędne gwarancje okresu istnienia (CS8345). - Podczas zwracania zmiennej lokalnej przez odwołanie z metody, upewnij się, że zmienna została zainicjowana ze źródła o wystarczającym zakresie ucieczki, takiego jak parametr ref lub wywołanie metody zwracającej ref, zamiast z wyrażenia typu wartościowego lub zmiennej o zakresie lokalnym, które stworzyłyby odwołanie do pamięci krótkotrwałej (CS9082, CS9083).
- W metodach lub właściwościach w wystąpieniach struktury unikaj zwracania
thislub dowolnych pól wystąpień przez referencję, jako że struktury są typami wartości, które są często kopiowane, a zwracanie referencji do członka wystąpienia może stworzyć odwołanie do tymczasowej kopii, która zostanie zniszczona po zwrocie z metody (CS9084).
Aby uzyskać więcej informacji, zobacz artykuł na temat typów struktury ref i standardowej sekcji języka C# na temat kontekstów bezpiecznych ref.