Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
usinginstrukcji - 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,shortintlongcharsbyteushortuintulongfloatdoublelub - 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
awaitw niebezpiecznym kontekście -
CS8812: Nie można przekonwertować
&Methodgrupy 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.
-
sizeofUżyj operatora wunsafekontekś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
usinginstrukcji - 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
fixedinstrukcji (CS0212). - Nie używaj instrukcji
fixedw wyrażeniach już stałych (CS0213). Zmienne lokalne i parametry w metodzieunsafesą już przypisane na stosie. - Nie używaj wyrażeń rzutowania po prawej stronie
fixedprzypisania instrukcji (CS0254). - Nie należy przyjmować adresu zmiennych lokalnych oznaczonych jako 'tylko do odczytu' (CS0459). Zmienne w
foreachpętlach orazusingifixedinstrukcjach są tylko do odczytu. - Użyj typów jawnych zamiast
varw instrukcjachfixed(CS0821). - Nie przypisuj zmiennych w kontekstach przeznaczonych wyłącznie do odczytu, takich jak
foreachpętle,usinglubfixedinstrukcje (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
islubasz typami wskaźników (CS0244). Te operatory testowania typów nie są prawidłowe dla wskaźników. - Nie używaj
newoperatora 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,shortintlongcharsbyteushortuintulongfloatlubdouble(CS1663). - Użyj instrukcji
fixedaby 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).
-
fixedUżyj modyfikatora pól zamiast atrybutuSystem.Runtime.CompilerServices.FixedBuffer(CS1716).
Wskaźniki funkcji
-
CS8812: Nie można przekonwertować
&Methodgrupy 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.