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

W tym artykule omówiono następującą diagnostykę kompilatora:

  • CS0193: Operator * lub -> musi być stosowany do wskaźnika
  • 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 lokalnej zmiennej zadeklarowanej w instrukcji fixed musi być typem wskaźnikowym
  • CS0210: Musisz podać inicjator w fixed lub using deklaracji instrukcji
  • CS0211: Nie można pobrać adresu danego wyrażenia
  • CS0212: Adres nieprzypisanego wyrażenia można pobrać tylko w ramach inicjatora instrukcji fixed
  • CS0213: Nie można użyć instrukcji fixed, aby uzyskać 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 za pomocą /unsafe polecenia
  • 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 przypiąć niejawnie typowanych zmiennych lokalnych
  • 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
  • CS1664: Bufor o stałym rozmiarze, o długości "length" i typu "type", jest zbyt duży
  • 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
  • CS7092: Stały bufor może mieć tylko jeden wymiar.
  • CS8372: Nie używaj atrybutu "System.Runtime.CompilerServices.FixedBuffer" we właściwości
  • CS8385: Podane wyrażenie nie może być używane w stałej instrukcji
  • CS8500: To pobiera adres, określa rozmiar lub deklaruje wskaźnik do typu zarządzanego ('type')
  • CS8812: Nie można przekonwertować grupy metod "method" na typ wskaźnika niebędący funkcją "type".
  • CS9049: Stałe pole nie może być polem ref.
  • CS9123: Operator "&" nie powinien być używany w parametrach ani zmiennych lokalnych w metodach asynchronicznych.
  • CS9360: Ta operacja może być używana tylko w niebezpiecznym kontekście
  • CS9361: stackalloc wyrażenie bez inicjatora wewnątrz SkipLocalsInit może być używane tylko w niebezpiecznym kontekście
  • CS9362: składowa „member” musi być używana w kontekście unsafe, ponieważ jest oznaczona jako „unsafe
  • CS9363: członek musi być używany w kontekście niebezpiecznym, ponieważ zawiera wskaźniki w podpisie
  • CS9364: Niebezpieczny członek „członek” nie może zastąpić bezpiecznego członka „członek”
  • CS9365: Niebezpieczny element 'member' nie może niejawnie implementować bezpiecznego elementu 'member'
  • CS9366: Niebezpieczny członek 'member' nie może implementować bezpiecznego członka 'member'
  • CS9367: RequiresUnsafeAttribute nie można zastosować do tego symbolu.
  • CS9368: RequiresUnsafeAttribute jest prawidłowy tylko zgodnie ze zaktualizowanymi regułami bezpieczeństwa pamięci.
  • CS9376: Wymagany jest kontekst unsafe dla konstruktora „constructor” oznaczonego jako „unsafe”, aby spełnić ograniczenie „new()” parametru typu „type parameter” w „generic type or method”
  • CS9377: Modyfikator "unsafe" nie ma tutaj żadnego wpływu na obecne zasady bezpieczeństwa pamięci.
  • CS9379: Nie używaj ciągu "RequiresUnsafeAttribute" w źródle; zamiast tego użyj modyfikatora "unsafe".
  • CS9388: Modyfikator "safe" może być używany tylko dla elementów członkowskich "extern", które nie są oznaczone jako "unsafe".
  • CS9389: element członkowski "extern" musi być oznaczony jako "unsafe" lub "safe".
  • CS9390: Oba częściowe deklaracje składowe muszą być oznaczone jako "safe" lub nie mogą być oznaczone jako "safe"
  • CS9392: Pole w jawnym lub rozszerzonym typie układu musi być oznaczone jako "unsafe" lub "safe".
  • CS9396: Nie można określać modyfikatorów „unsafe” ani „safe” zarówno przy właściwości lub indeksatorze „property”, jak i przy jego akcesorze. Usuń jeden z nich.
  • CS9397: Nie można określić tego samego modyfikatora 'unsafe' lub 'safe' dla wszystkich akcesorów właściwości lub indeksatora 'property'. Zamiast tego należy umieścić ten modyfikator na samej właściwości.
  • CS9398: Nie można oczekiwać w kontekście instrukcji "fixed"

Operacje wskaźnika i wyłuszczanie

  • CS0193: Operator * lub -> musi zostać zastosowany do wskaźnika
  • 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. W przeciwieństwie do języków C/C++, w C# nie można używać wskaźników do funkcji bezpośrednio.
  • Wskaźniki indeksu z tylko jedną wartością (CS0196). Wskaźniki nie obsługują indeksowania wielowymiarowego.
  • 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
  • CS8500: Pobiera adres, pobiera rozmiar lub deklaruje wskaźnik do typu zarządzanego ('typ')

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).
  • Unikaj pobierania adresu, określania rozmiaru lub deklarowania wskaźnika na typ zarządzany (CS8500). To ostrzeżenie (poziom 4) jest uruchamiane, gdy kompilator wykryje operacje wskaźnika na typach zarządzanych. Typ zarządzany to dowolny typ odwołania lub dowolna struktura zawierająca typ odwołania jako pole lub właściwość. Aby uzyskać więcej informacji, zobacz Typy niezarządzane.

Naprawiono użycie wyrażenia

  • 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 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 przypiąć niejawnie typowanych zmiennych lokalnych
  • CS1656: Nie można przypisać do zmiennej , ponieważ jest to typ zmiennej tylko do odczytu.
  • CS8385: Podane wyrażenie nie może być używane w stałej instrukcji

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. Ten błąd nie jest już generowany przez bieżące wersje kompilatora.
  • 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).
  • Używaj tylko wyrażeń, które obsługują przypinanie w instrukcji fixed (CS8385). Wyrażenie musi być zmienną adresową, ciągiem lub typem, który implementuje odpowiednią GetPinnableReference metodę.

Wymagania dotyczące niebezpiecznego 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: Żaden z elementów "is" ani "as" nie jest dozwolony dla typów wskaźników
  • CS1919: Nie można użyć niebezpiecznego typu "nazwa typu" podczas tworzenia obiektu
  • CS4004: Nie można await w kontekście niebezpiecznym
  • CS9123: Operator "&" nie powinien być używany w parametrach ani zmiennych lokalnych w metodach asynchronicznych
  • CS9360: Ta operacja może być używana tylko w niebezpiecznym kontekście
  • CS9361: stackalloc wyrażenie bez inicjatora wewnątrz SkipLocalsInit może być używane tylko w niebezpiecznym kontekście
  • CS9362: składowa „member” może być używana tylko w kontekście unsafe, ponieważ jest oznaczona jako „unsafe
  • CS9363: 'członek' musi być używany w niebezpiecznym kontekście, ponieważ zawiera wskaźniki w swojej sygnaturze
  • CS9376: Wymagany jest niebezpieczny kontekst dla konstruktora „constructor” oznaczonego jako „unsafe”, aby spełnić ograniczenie „new()” parametru typu „type parameter” w „typie lub metodzie generycznej”
  • CS9398: Nie można użyć await w kontekście instrukcji „fixed

Ta diagnostyka występuje, gdy używasz niebezpiecznych konstrukcji kodu bez wymaganego unsafe kontekstu lub podczas próby wykonywania operacji, które nie są dozwolone z niebezpiecznymi typami. Aby uzyskać więcej informacji, zobacz Niebezpieczny kod i wskaźniki oraz unsafe słowo kluczowe.

  • Oznacz metody, typy lub bloki kodu korzystające ze wskaźników lub o stałym rozmiarze ze słowem kluczowym unsafe (CS0214). Kompilator wymaga jawnego niebezpiecznego kontekstu dla dowolnego kodu, który działa z typami wskaźnika lub polami buforu o stałym rozmiarze.
  • Włącz opcję kompilatora AllowUnsafeBlocks w ustawieniach projektu (CS0227). Bez tej opcji kompilator odrzuca wszystkie unsafe bloki, nawet jeśli kod jest w inny sposób poprawny.
  • 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, ponieważ wskaźniki nie uczestniczą w hierarchii typó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.
  • Traktuj CS4004 jako nieaktualne wytyczne. W języku C# 14 lub starszym await wewnątrz niebezpiecznego kontekstu nie jest dozwolone. W ramach zmian dotyczących bezpieczeństwa pamięci w wersji zapoznawczej C# 15 element await jest dozwolony w kontekście unsafe, więc to ogólne ograniczenie nie opisuje już obecnej reguły.
  • Nie używaj operatora address-of (&) dla parametrów ani zmiennych lokalnych w metodach asynchronicznych (CS9123). Zmienna może nie istnieć na stosie, gdy operacja asynchroniczna zostanie wznowiona po wystąpieniu punktu zawieszenia.
  • Oznacz operacje obejmujące niebezpieczne konstrukcje (takie jak dereferencja wskaźnika, operator pobierania adresu lub sizeof na typach niezarządzanych) za pomocą słowa kluczowego unsafe (CS9360). W ramach zaktualizowanych reguł bezpieczeństwa pamięci w języku C# 15 kompilator identyfikuje poszczególne operacje, które wymagają niebezpiecznego kontekstu.
  • Użyj słowa kluczowego unsafe dla stackalloc wyrażeń bez inicjatorów, gdy SkipLocalsInit atrybut jest stosowany (CS9361). Bez inicjalizatora zarezerwowana pamięć na stosie zawiera niezainicjalizowane dane, co stanowi niebezpieczną operację.
  • Użyj kontekstu unsafe podczas wywoływania składników oznaczonych znacznikiem unsafe (CS9362) lub składników mających wskaźniki w swoich sygnaturach (CS9363). W ramach zaktualizowanego modelu bezpieczeństwa pamięci kompilator zgłasza błąd CS9362 dla składowych, które jawnie przenoszą obowiązek zapewnienia bezpieczeństwa na kod wywołujący, oraz błąd CS9363 w przypadkach zgodności ze starszymi wersjami, w których sama sygnatura zawiera wskaźniki.
  • Użyj kontekstu unsafe, gdy ograniczenie new() wymaga wywołania konstruktora oznaczonego jako unsafe (CS9376). Instancja ogólna wywołuje konstruktor niejawnie, więc kontekst wywołujący musi być niesafe.
  • Przenieś await poza ciało lub inicjator instrukcji fixedstatement (CS9398). Wersja zapoznawcza języka C# 15 dopuszcza await w niebezpiecznym kontekście, ale czas przypięcia instrukcji fixed nadal nie może obejmować punktu wstrzymania asynchronicznego. Zaczekaj na zakończenie operacji przed wejściem do fixed, albo opuść instrukcję fixed, zanim użyjesz await.

Niebezpieczne umowy dotyczące bezpieczeństwa członków

  • CS9364: Niebezpieczny członek 'member' nie może zastąpić bezpiecznego członka 'member'
  • CS9365: Niebezpieczny członek 'member' nie może niejawnie zaimplementować bezpiecznego członka 'member'
  • CS9366: Niebezpieczny element członkowski "członek" nie może zaimplementować bezpiecznego elementu członkowskiego "członek"
  • CS9367: RequiresUnsafeAttribute nie można zastosować do tego symbolu.
  • CS9368: RequiresUnsafeAttribute jest prawidłowy tylko zgodnie ze zaktualizowanymi regułami bezpieczeństwa pamięci.
  • CS9377: Modyfikator "unsafe" nie ma tutaj żadnego wpływu na obecne zasady bezpieczeństwa pamięci.
  • CS9379: Nie używaj ciągu "RequiresUnsafeAttribute" w źródle; zamiast tego użyj modyfikatora "unsafe".
  • CS9388: Modyfikator "safe" może być używany tylko dla elementów członkowskich "extern", które nie są oznaczone jako "unsafe".
  • CS9389: składowa "extern" musi być oznaczona jako "unsafe" lub "safe".
  • CS9390: Oba częściowe deklaracje składowe muszą być oznaczone jako "safe" lub nie mogą być oznaczone jako "safe"
  • CS9396: Nie można określać modyfikatorów „unsafe” ani „safe” zarówno dla właściwości lub indeksatora „property”, jak i dla jego metody dostępu. Usuń jeden z nich.
  • CS9397: Nie można zastosować tego samego modyfikatora „unsafe” lub „safe” do wszystkich akcesorów właściwości lub indeksatora „property”. Zamiast tego należy umieścić ten modyfikator na samej właściwości.

Ta diagnostyka wymusza reguły kontraktu bezpieczeństwa języka C# 15 dla członków oznaczonych jako niebezpieczne. Kompilator zapewnia, że niebezpieczne elementy członkowskie nie naruszają oczekiwań bezpieczeństwa ustanowionych przez klasy bazowe i interfejsy. Aby uzyskać więcej informacji, zobacz Niebezpieczny kod i wskaźniki oraz unsafe słowo kluczowe.

  • Nie przesłaniaj bezpiecznego elementu podstawowego członkiem niebezpiecznym (CS9364). Przesłonięcie musi zachować kontrakt bezpieczeństwa elementu bazowego. Jeśli element podstawowy jest bezpieczny, nadpisanie musi być również bezpieczne. Usuń modyfikator unsafe lub RequiresUnsafeAttribute z zastępującego członka lub oznacz podstawowy członek jako niebezpieczny.
  • Nie implementuj implicitnie bezpiecznego elementu członkowskiego interfejsu za pomocą niebezpiecznego elementu członkowskiego (CS9365). Gdy typ niejawnie implementuje element członkowski interfejsu, wywołujące za pośrednictwem interfejsu oczekują bezpiecznej operacji. Usuń niebezpieczne oznaczenie ze składnika implementacji lub użyj implementacji interfejsu jawnego.
  • Nie implementuj jawnie bezpiecznego członka interfejsu przy użyciu niebezpiecznego członka (CS9366). Nawet w przypadku jawnej implementacji należy zachować kontrakt bezpieczeństwa elementu członkowskiego interfejsu.
  • Zastosuj RequiresUnsafeAttribute tylko do obsługiwanych typów symboli (CS9367). Ten atrybut można zastosować do metod, właściwości, zdarzeń, konstruktorów i typów, ale nie wszystkie rodzaje symboli go obsługują.
  • Włącz zaktualizowane reguły bezpieczeństwa pamięci, aby używać RequiresUnsafeAttribute (CS9368). Ten atrybut jest częścią ulepszonego modelu bezpieczeństwa pamięci w języku C# 15 i nie jest rozpoznawany zgodnie ze starszymi regułami. Upewnij się, że projekt jest przeznaczony dla wersji językowej obsługującej zaktualizowane reguły.
  • unsafe Usuń modyfikator, gdy nie ma żadnego efektu (CS9377). Zgodnie z bieżącymi regułami bezpieczeństwa pamięci niektóre konteksty nie wymagają ani nie korzystają z unsafe modyfikatora. Kompilator ostrzega, gdy modyfikator jest bez znaczenia, dzięki czemu można wyczyścić niepotrzebne adnotacje.
  • unsafe Użyj modyfikatora bezpośrednio w deklaracji elementu członkowskiego, zamiast stosować RequiresUnsafeAttribute w kodzie źródłowym (CS9379). Atrybut jest przeznaczony tylko do reprezentacji metadanych; w kodzie unsafe źródłowym słowo kluczowe jest poprawnym mechanizmem.
  • Zastosuj modyfikator safe tylko do składowych extern, które nie są jeszcze oznaczone jako unsafe (CS9388). Modyfikator safe jawnie wyłącza element członkowski extern spod domyślnego założenia unsafe dla deklaracji extern.
  • Oznacz każdy składnik extern jako unsafe lub safe (CS9389). Zgodnie ze zaktualizowanymi regułami bezpieczeństwa pamięci członkowie extern muszą jawnie zadeklarować swój kontrakt bezpieczeństwa, ponieważ kompilator nie może zweryfikować implementacji.
  • Upewnij się, że obie częściowe deklaracje składowe zgadzają się na safe modyfikator (CS9390). Jeśli jedna deklaracja częściowa jest oznaczona safe, druga musi być również oznaczona safe w celu zachowania spójnego kontraktu bezpieczeństwa.
  • Umieść unsafe lub safe na właściwości lub indekserze albo na metodzie dostępu, ale nie na obu jednocześnie (CS9396). Jeśli właściwość określa kontrakt dla wszystkich akcesorów, umieść modyfikator bezpośrednio we właściwości. Jeśli tylko jedna metoda dostępu się różni, umieść modyfikator w tej metodzie dostępu i pozostaw właściwość bez modyfikacji.
  • Jeśli każdy akcesor właściwości lub indeksatora ma ten sam modyfikator unsafe lub safe, przenieś ten modyfikator do deklaracji właściwości lub indeksatora (CS9397). Używaj modyfikatorów akcesorów tylko wtedy, gdy akcesory celowo różnią się od siebie.

Jawne lub rozszerzone pola układu

  • CS9392: Pole w jawnym lub rozszerzonym typie układu musi być oznaczone jako "unsafe" lub "safe".

Ta diagnostyka występuje w zaktualizowanym modelu bezpieczeństwa pamięci, gdy pole instancji ma jawny lub rozszerzony układ, a deklaracja nie określa, czy pole jest unsafe, czy safe. Aby uzyskać więcej informacji, zobacz Niebezpieczny kod i wskaźniki oraz safe słowo kluczowe.

  • Oznacz każde pole instancji w typie z [StructLayout(LayoutKind.Explicit)] lub unsafe jako [ExtendedLayout] albo safe (CS9392). Jeśli pole jest syntetyzowane dla właściwości automatycznej, właściwości opartej na polu, parametru podstawowego konstruktora lub zdarzenia przypominającego pole, umieść modyfikator we właściwości, parametrze lub zdarzeniu, które jest właścicielem wygenerowanego pola.

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, shortintlongcharsbyteushortuintulongfloatdouble lub
  • CS1664: Bufor o stałym rozmiarze, o długości „length” i typie „type”, jest zbyt duży
  • 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 wyrażeniach niefiksowanych. Spróbuj użyć stałej instrukcji.
  • 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".
  • CS7092: Stały bufor może mieć tylko jeden wymiar.
  • CS8372: Nie używaj atrybutu "System.Runtime.CompilerServices.FixedBuffer" we właściwości
  • CS9049: Stałe pole nie może być polem ref.

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). Całkowity rozmiar buforu (liczba elementów pomnożony przez rozmiar elementu) nie może przekraczać 2^31 bajtów (CS1664).
  • 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). Nie stosuj tego atrybutu do właściwości (CS8372).
  • Zadeklaruj stałe bufory tylko z jednym wymiarem (CS7092). Wielowymiarowe stałe bufory nie są obsługiwane.
  • Nie deklaruj buforów o stałym rozmiarze jako pól (ref). o stałym rozmiarze muszą być polami wartości.

Wskaźniki funkcji

  • CS8812: Nie można przekonwertować grupy metod „method” na typ wskaźnika innego niż funkcja „type”.

Aby uzyskać wskaźnik funkcji, użyj operatora address-of z jawnym rzutowaniem na typ 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.