Udostępnij przez


Usuwanie błędów i ostrzeżeń w niebezpiecznych konstrukcjach kodu

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

  • CS0193: Operator * lub -> musi być zastosowany do wskaźnika danych
  • CS0196: Wskaźnik musi być indeksowany tylko przez jedną wartość
  • CS0208: Nie można pobrać adresu, pobrać rozmiaru lub zadeklarować wskaźnik do typu zarządzanego ('type')
  • CS0209: Typ zmiennej lokalnej zadeklarowanej w instrukcji fixed musi być typem wskaźnika
  • CS0210: Należy podać inicjator w deklaracji stałej lub using instrukcji
  • CS0211: Nie można pobrać adresu danego wyrażenia
  • CS0212: Adres niefiksowanego wyrażenia można pobrać tylko wewnątrz inicjatora stałej instrukcji
  • CS0213: Nie można użyć instrukcji fixed, aby pobrać adres już ustalonego wyrażenia
  • CS0214: Wskaźniki i bufory o stałym rozmiarze mogą być używane tylko w niezarządzanym kontekście
  • CS0227: Niebezpieczny kod może występować tylko w przypadku kompilowania z /niebezpiecznym
  • CS0233: "identyfikator" nie ma wstępnie zdefiniowanego rozmiaru, dlatego rozmiar może być używany tylko w niebezpiecznym kontekście
  • CS0242: Operacja, o której mowa, jest niezdefiniowana dla wskaźników typu void
  • CS0244: Instrukcje 'is' ani 'as' nie są poprawne dla typów wskaźnikowych
  • CS0254: Prawa strona przypisania stałej instrukcji może nie być wyrażeniem rzutowania
  • CS0459: Nie można pobrać adresu zmiennej lokalnej tylko do odczytu
  • CS0821: Nie można zdefiniować niejawnie wpisanych lokalnych zmiennych
  • CS1641: Pole buforu o stałym rozmiarze musi mieć specyfikator rozmiaru tablicy po nazwie pola
  • CS1642: Pola buforu o stałym rozmiarze mogą być tylko elementami członkowskimi struktur.
  • CS1656: Nie można przypisać do zmiennej , ponieważ jest to typ zmiennej tylko do odczytu.
  • CS1663: Typ buforu o stałym rozmiarze musi być jednym z następujących: bool, , byte, shortintlongcharsbyteushortuintulongfloatdouble lub
  • CS1665: Bufory o stałym rozmiarze muszą mieć długość większą niż zero
  • CS1666: Nie można używać buforów o stałym rozmiarze zawartych w nieustalonych wyrażeniach. Spróbuj użyć instrukcji fixed.
  • CS1708: Bufory o stałym rozmiarze mogą być dostępne tylko za pośrednictwem zmiennych lokalnych lub pól
  • CS1716: Nie używaj atrybutu "System.Runtime.CompilerServices.FixedBuffer". Zamiast tego użyj modyfikatora pola "fixed".
  • CS1919: Nie można użyć niebezpiecznego typu "nazwa typu" podczas tworzenia obiektu.
  • CS4004: Nie można await w niebezpiecznym kontekście
  • CS8812: Nie można przekonwertować &Method grupy na typ wskaźnika innego niż funkcja.
  • CS9123: Operator "&" nie powinien być używany w parametrach ani zmiennych lokalnych w metodach asynchronicznych.

Operacje wskaźnika i wyłuszczanie

  • CS0193: Operator * albo -> należy zastosować do wskaźnika danych
  • CS0196: Wskaźnik musi być indeksowany tylko przez jedną wartość
  • CS0242: Operacja, o której mowa, jest niezdefiniowana dla wskaźników typu void

Aby prawidłowo używać operacji wskaźnika, postępuj zgodnie z regułami dotyczącymi operacji wyłuszczania, indeksowania i operacji arytmetycznych. Aby uzyskać więcej informacji, zobacz Typy wskaźników i wskaźniki funkcji.

  • Zastosuj operator * lub -> tylko do wskaźników danych (CS0193). Nie używaj tych operatorów z typami niewskaźnikowymi lub wskaźnikami funkcji. Wskaźniki funkcji nie mogą być dereferencjonowane w C#, w przeciwieństwie do C/C++.
  • Wskaźniki indeksu z tylko jedną wartością (CS0196). Indeksowanie wielowymiarowe nie jest obsługiwane dla wskaźników.
  • Unikaj operacji, które są niezdefiniowane na wskaźnikach void (CS0242). Na przykład nie zwiększaj wskaźnika pustki, ponieważ kompilator nie zna rozmiaru wskazywanych danych.

Typy wskaźników i typy zarządzane

  • CS0208: Nie można pobrać adresu, pobrać rozmiaru lub zadeklarować wskaźnik do typu zarządzanego ('type')
  • CS0233: "identyfikator" nie ma wstępnie zdefiniowanego rozmiaru, dlatego rozmiar może być używany tylko w niebezpiecznym kontekście

Aby poprawnie pracować ze wskaźnikami i sizeof operatorem, użyj typów niezarządzanych i odpowiednich kontekstów. Aby uzyskać więcej informacji, zobacz Typy niezarządzane i sizeof operator.

  • Używaj wskaźników tylko z typami niezarządzanymi (CS0208). Nie należy pobierać adresu typów zarządzanych, określać ich rozmiaru ani deklarować do nich wskaźników. Typy zarządzane obejmują typy odwołań i struktury zawierające pola typu odwołania lub właściwości.
  • sizeof Użyj operatora w unsafe kontekście podczas pracy z typami, których rozmiar nie jest stałą czasu kompilacji (CS0233).

Bufory o stałej wielkości

  • CS0209: Typ lokalnego zadeklarowanego w stałej instrukcji musi być typem wskaźnika
  • CS0210: Należy podać inicjator w deklaracji stałej lub using instrukcji
  • CS0211: Nie można pobrać adresu danego wyrażenia
  • CS0212: Adres niefiksowanego wyrażenia można pobrać tylko wewnątrz inicjatora stałej instrukcji
  • CS0213: Nie można użyć instrukcji 'fixed', aby uzyskać adres stałego już wyrażenia
  • CS0254: Prawa strona przypisania stałej instrukcji może nie być wyrażeniem rzutowania
  • CS0459: Nie można pobrać adresu zmiennej lokalnej tylko do odczytu
  • CS0821: Nie można naprawić niejawnie wpisanych ustawień lokalnych
  • CS1656: Nie można przypisać do zmiennej , ponieważ jest to typ zmiennej tylko do odczytu.

Te błędy występują, gdy używasz instrukcjifixed niepoprawnie. Instrukcja fixed zapobiega przeniesieniu przenośnej zmiennej przez zbieracz odpadów i deklaruje wskaźnik do tej zmiennej. Aby uzyskać więcej informacji, zobacz Niebezpieczny kod i wskaźniki.

Aby poprawnie użyć instrukcji fixed :

  • Zadeklaruj zmienną jako typ wskaźnika (CS0209).
  • Podaj inicjator w deklaracji instrukcji fixed (CS0210).
  • Weź adres tylko prawidłowych wyrażeń: pola, zmienne lokalne i pośredni wskaźnik (CS0211). Nie należy przyjmować adresu obliczonych wyrażeń, takich jak suma dwóch zmiennych.
  • Użyj operatora address-of w wyrażeniach niefiksowanych tylko w inicjatorze fixed instrukcji (CS0212).
  • Nie używaj instrukcji fixed w wyrażeniach już stałych (CS0213). Zmienne lokalne i parametry w metodzie unsafe są już przypisane na stosie.
  • Nie używaj wyrażeń rzutowania po prawej stronie fixed przypisania instrukcji (CS0254).
  • Nie należy przyjmować adresu zmiennych lokalnych oznaczonych jako 'tylko do odczytu' (CS0459). Zmienne w foreach pętlach oraz using i fixed instrukcjach są tylko do odczytu.
  • Użyj typów jawnych zamiast var w instrukcjach fixed (CS0821).
  • Nie przypisuj zmiennych w kontekstach przeznaczonych wyłącznie do odczytu, takich jak foreach pętle, using lub fixed instrukcje (CS1656).

Niebezpieczne ograniczenia kontekstu

  • CS0214: Wskaźniki i bufory o stałym rozmiarze mogą być używane tylko w niezabezpieczonym kontekście
  • CS0227: Niebezpieczny kod może występować tylko w przypadku kompilowania z /niebezpiecznym
  • CS0244: Operatorów 'is' i 'as' nie można używać z typami wskaźnikowymi
  • CS1919: Nie można użyć niebezpiecznego typu "nazwa typu" podczas tworzenia obiektu
  • CS4004: Nie można oczekiwać w niebezpiecznym kontekście
  • CS9123: Operator "&" nie powinien być używany na parametrach ani zmiennych lokalnych w metodach asynchronicznych

Te błędy występują, gdy używasz niebezpiecznych konstrukcji kodu bez odpowiedniego niebezpiecznego kontekstu lub podczas próby wykonywania operacji, które nie są dozwolone w niebezpiecznym kodzie. Aby uzyskać więcej informacji, zobacz Niebezpieczny kod i wskaźniki oraz unsafe słowo kluczowe.

Aby prawidłowo używać niebezpiecznego kodu:

  • Oznacz metody, typy lub bloki kodu korzystające ze wskaźników lub o stałym rozmiarze ze słowem kluczowym unsafe (CS0214).
  • Włącz opcję kompilatora AllowUnsafeBlocks w ustawieniach projektu podczas używania słowa kluczowego unsafe (CS0227).
  • Nie używaj operatorów is lub as z typami wskaźników (CS0244). Te operatory testowania typów nie są prawidłowe dla wskaźników.
  • Nie używaj new operatora do tworzenia wystąpień typu wskaźnika (CS1919). Aby utworzyć obiekty w niezarządzanej pamięci, użyj międzyoperacyjności, aby wywołać metody natywne zwracające wskaźniki.
  • Zachowaj niebezpieczny kod niezależnie od kodu asynchronicznego (CS4004). Utwórz oddzielne metody dla niebezpiecznych operacji i wywołaj je z metod asynchronicznych.
  • Nie używaj operatora address-of (&) dla parametrów ani zmiennych lokalnych w metodach asynchronicznych (CS9123). Zmienna może nie istnieć po zakończeniu operacji asynchronicznych.

bufory o stałym rozmiarze

  • CS1641: Pole buforu o stałym rozmiarze musi mieć specyfikator rozmiaru tablicy po nazwie pola
  • CS1642: Pola buforu o stałym rozmiarze mogą być tylko elementami członkowskimi struktur
  • CS1663: Typ buforu o stałym rozmiarze musi być jednym z następujących: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float lub double
  • CS1665: Bufory o stałym rozmiarze muszą mieć długość większą niż zero
  • CS1666: Nie można używać buforów o stałym rozmiarze znajdujących się w niezafiksowanych wyrażeniach. Spróbuj użyć instrukcji fixed
  • CS1708: Bufory o stałym rozmiarze mogą być dostępne tylko poprzez zmienne lokalne lub pola
  • CS1716: Nie używaj atrybutu "System.Runtime.CompilerServices.FixedBuffer". Zamiast tego użyj modyfikatora pola "fixed"

Te błędy występują podczas pracy z buforami o stałym rozmiarze. Bufory o stałym rozmiarze to tablice osadzone bezpośrednio w strukturach i są używane głównie w scenariuszach interopu. Aby uzyskać więcej informacji, zobacz bufory o stałym rozmiarze.

Aby poprawnie zadeklarować bufory o stałym rozmiarze i używać ich:

  • Określ rozmiar tablicy po nazwie pola przy użyciu dodatniej stałej całkowitej (CS1641, CS1665).
  • Zadeklaruj bufory o stałym rozmiarze tylko w strukturach, a nie w klasach (CS1642). Jeśli potrzebujesz pola w klasie, użyj tablicy regularnej.
  • Użyj jednego z obsługiwanych typów elementów: bool, , byte, shortintlongcharsbyteushortuintulongfloatlub double (CS1663).
  • Użyj instrukcji fixed aby przypiąć zawierającą strukturę przed uzyskaniem dostępu do buforu (CS1666).
  • Bufory o stałym rozmiarze używaj tylko za pośrednictwem zmiennych lokalnych lub pól, a nie za pośrednictwem wyrażeń pośrednich (CS1708).
  • fixed Użyj modyfikatora pól zamiast atrybutu System.Runtime.CompilerServices.FixedBuffer (CS1716).

Wskaźniki funkcji

  • CS8812: Nie można przekonwertować &Method grupy na typ wskaźnika innego niż funkcja

Aby uzyskać wskaźnik funkcji, użyj operatora address-of z rzutowania jawnego typu wskaźnika funkcji. Nie używaj operatora &address-of, aby przypisać grupy metod do void* lub innych typów wskaźników innych niż funkcja. Aby uzyskać więcej informacji, zobacz Wskaźniki funkcji.