Udostępnij za pośrednictwem


Rozwiąż błędy i ostrzeżenia dotyczące deklaracji operatorów oraz przepełnienia

W tym artykule opisano następujące błędy i ostrzeżenia kompilatora:

  • CS0031: Nie można przekonwertować wartości stałej na typ
  • CS0056: Niespójna dostępność: typ zwracany "type" jest mniej dostępny niż operator "operator"
  • CS0057: Niespójna dostępność: typ parametru "type" jest mniej dostępny niż operator "operator"
  • CS0215: Zwracany typ operatora Prawda lub Fałsz musi być wartością logiczną
  • CS0216: Operator „operator” wymaga również zdefiniowania odpowiadającego mu operatora „missing_operator”
  • CS0217: Aby był stosowany jako operator krótkiego spięcia, zdefiniowany przez użytkownika operator logiczny („operator”) musi mieć taki sam typ zwracany jak typ jego dwóch parametrów.
  • CS0218: Typ ('type') musi zawierać deklaracje operatora true i operator false
  • CS0220: Operacja przepełnia się w czasie kompilacji w trybie sprawdzania
  • CS0221: Nie można przekonwertować stałej wartości "value" na typ (użyj składni "unchecked" w celu zastąpienia)
  • CS0448: Typ zwracany dla operatora ++ lub -- musi być typem zawierającym lub pochodnym typu zawierającego
  • CS0463: Ocena wyrażenia stałej dziesiętnej nie powiodła się z powodu błędu: "błąd"
  • CS0543: "wyliczenie": wartość modułu wyliczającego jest zbyt duża, aby zmieścić się w jego typie
  • CS0552: "procedury konwersji": konwersja zdefiniowana przez użytkownika na/z interfejsu
  • CS0553: "procedury konwersji": konwersja zdefiniowana przez użytkownika na/z klasy bazowej
  • CS0554: "procedury konwersji": konwersja zdefiniowana przez użytkownika na/z klasy pochodnej
  • CS0555: Operator zdefiniowany przez użytkownika nie może przyjąć obiektu otaczającego typu i przekonwertować na obiekt otaczającego typu
  • CS0556: Konwersja zdefiniowana przez użytkownika musi zostać przekonwertowana na lub z otaczającego typu
  • CS0557: Powtarzająca się konwersja zdefiniowana przez użytkownika w typie
  • CS0558: Operator zdefiniowany przez użytkownika musi być zadeklarowany jako statyczny i publiczny
  • CS0559: Typ parametru dla operatora ++ lub -- musi być typem obejmującym
  • CS0562: Parametr operatora jednoargumentowego musi być typem, który go zawiera
  • CS0563: Jeden z parametrów operatora binarnego musi być typem zawierającym
  • CS0564: Pierwszy operand przeciążonego operatora przesunięcia musi mieć ten sam typ co typ zawierający, a typ drugiego operandu musi być int
  • CS0567: Interfejsy nie mogą zawierać operatorów
  • CS0590: Operatory zdefiniowane przez użytkownika nie mogą zwracać wartości void
  • CS0594: Stała zmiennoprzecinkowa znajduje się poza zakresem typu "type"
  • CS0652: Porównanie z stałą całkowitą jest bezużyteczne; stała znajduje się poza zakresem typu "type"
  • CS0659: klasa zastępuje obiekt.Equals(object o), ale nie zastępuje obiektu.GetHashCode()
  • CS0660: Typ definiuje operator == lub operator !=, ale nie zastępuje Object.Equals(object o)
  • CS0661: Typ definiuje operator == lub operator !=, ale nie Object.GetHashCode()zastępuje
  • CS0715: Klasy statyczne nie mogą zawierać operatorów zdefiniowanych przez użytkownika
  • CS1021: Stała całkowita jest zbyt duża
  • CS1037: Oczekiwano przeciążalnego operatora
  • CS1553: Deklaracja jest nieprawidłowa; użyj operatora <modyfikatora dest-type> (...) zamiast
  • CS8930: Jawna implementacja operatora zdefiniowanego przez użytkownika musi być zadeklarowana jako statyczna
  • CS8931: Konwersja zdefiniowana przez użytkownika w interfejsie musi zostać przekonwertowana na lub z parametru typu ograniczonego do otaczającego typu do otaczającego typu
  • CS8778: Stała wartość "value" może przepełnić typ "type" podczas działania programu (użyj składni "unchecked", aby obejść ten problem)
  • CS8973: Może wystąpić przepełnienie podczas działania (użyj składni 'unchecked', aby to obejść)
  • CS9023: Nie można sprawdzić operatora.
  • CS9024: Operator nie może być oznaczony jako niekontrolowany.
  • CS9025: Operator wymaga również zadeklarowania zgodnej wersji, która nie jest sprawdzana.
  • CS9027: Nieoczekiwane słowo kluczowe "unchecked".
  • CS9308: Operator zdefiniowany przez użytkownika musi być zadeklarowany publicznie.
  • CS9310: Typ zwracany dla tego operatora musi mieć wartość void.
  • CS9311: Typ nie implementuje elementu członkowskiego interfejsu. Typ nie może zaimplementować elementu członkowskiego, ponieważ jeden z nich nie jest operatorem.
  • CS9312: Typ nie może zastąpić dziedziczonego członka, ponieważ jeden z nich nie jest operatorem.
  • CS9313: Przeciążony operator przypisania złożonego przyjmuje jeden parametr.
  • CS9340: Operator nie może być stosowany do operandów. Pokazano najbliższego niedostępnego kandydata.
  • CS9341: Operator nie może być stosowany do operandu. Pokazano najbliższego nieodpowiedniego kandydata.
  • CS9342: Rozpoznawanie operatorów jest niejednoznaczne między następującymi elementami członkowskimi.

Wymagania dotyczące podpisu operatora

  • CS0448: Typ zwracany dla ++ lub -- operatora musi być typem zawierającym lub pochodnym od typu zawierającego.
  • CS0559: Typ parametru dla ++ operatora lub -- musi być typem zawierającym.
  • CS0562: Parametr operatora jednoargumentowego musi być typem zawierającym.
  • CS0563: Jeden z parametrów operatora binarnego musi być typem zawierającym.
  • CS0564: Pierwszy operand przeciążonego operatora przesunięcia musi mieć taki sam typ jak typ klasy zawierającej, a typ drugiego operandu musi być typu int.
  • CS0567: Interfejsy nie mogą zawierać operatorów.
  • CS0590: Operatory zdefiniowane przez użytkownika nie mogą zwracać wartości void.
  • CS9310: Typ zwracany dla tego operatora musi mieć wartość void.
  • CS9340: Operator nie może być zastosowany do operandów. Pokazano najbliższego nieodpowiedniego kandydata.
  • CS9341: Operator nie może być stosowany do operandu. Pokazano najbliższy niewłaściwy kandydat.
  • CS9342: Rozstrzyganie operatorów jest niejednoznaczne między następującymi członkami.

Każdy typ operatora ma określony parametr i zwraca wymagania dotyczące typu zdefiniowane przez specyfikację języka. Aby zapoznać się z pełnymi regułami, na których operatory mogą być przeciążone, zobacz Przeciążenie operatorów i Operatory w specyfikacji języka C#.

  • Zmień typ zwracany operatorów ++ lub -- na typ zawierający lub typ pochodzący z niego (CS0448). Język wymaga, aby operatory inkrementacji i dekrementacji zwracały wartość zgodną z typem zawierającym, aby wynik mógł zostać przypisany z powrotem do tej samej zmiennej.
  • Zmień parametr operatorów ++ lub -- na typ zawierający (CS0559). Operatory inkrementacji i dekrementacji muszą działać na wystąpieniach własnego typu.
  • Zmień parametr operatora jednoargumentowego na typ zawierający (CS0562). Operatory jednoargumentowe muszą akceptować operand typu, który je deklaruje.
  • Upewnij się, że co najmniej jeden parametr operatora binarnego jest typem zawierającym (CS0563). Operatory binarne muszą obejmować typ deklarowania, aby kompilator mógł je rozpoznać za pomocą tego typu.
  • Zmień pierwszy parametr operatora shift na typ zawierający, a drugi parametr na int (CS0564). Język definiuje operatory przesunięcia z określonym podpisem: typ, który jest przesuwany, oraz całkowita wartość przesunięcia.
  • Przenieś deklaracje operatorów z interfejsów i do klas lub struktur (CS0567). Tradycyjne (niestatyczne) deklaracje operatorów nie są dozwolone w interfejsach. Aby zapoznać się z statycznymi operatorami abstrakcyjnymi w interfejsach, zobacz Statyczne błędy elementów członkowskich abstrakcyjnych i wirtualnych.
  • Zmień typ zwracany operatora na typ niepusty (CS0590). Większość operatorów zdefiniowanych przez użytkownika musi zwracać wartość. Wyjątkiem są operatory przypisania złożonego, które wymagają typu zwracanego void (CS9310).
  • Popraw typy parametrów lub dodaj brakujące przeciążenia operatora, aby kompilator mógł znaleźć pasujący operator dla typów operandów używanych w miejscu wywołania (CS9340, CS9341). Jeśli nie ma odpowiedniego operatora, kompilator pokazuje najbliższego kandydata, aby pomóc zdiagnozować niezgodność.
  • Dodaj jawne rzutowania w lokacji wywołania lub podaj bardziej szczegółowe przeciążenia, aby wyeliminować niejednoznaczność, gdy przeciążenia wielu operatorów pasują równie dobrze (CS9342).

Ważne

Wymagania dotyczące sygnatur dla statycznych operatorów binarnych i odpowiednich operatorów złożonego przypisania instancyjnego są różne. Upewnij się, że podpis jest zgodny z odpowiednią deklaracją.

Wymagania dotyczące deklaracji operatora

  • CS0558: Operator zdefiniowany przez użytkownika musi być zadeklarowany jako statyczny i publiczny.
  • CS0715: Klasy statyczne nie mogą zawierać operatorów zdefiniowanych przez użytkownika.
  • CS1037: Oczekiwano operatora przeciążalnego.
  • CS1553: Deklaracja jest nieprawidłowa; użyj operatora <modyfikatora dest-type> (...) zamiast.
  • CS9308: Operator zdefiniowany przez użytkownika musi być zadeklarowany publicznie.

Język wymaga określonych modyfikatorów i składni dla deklaracji operatorów. Aby zapoznać się z pełnymi regułami, zobacz Operator przeciążenie i Operatory konwersji zdefiniowane przez użytkownika.

  • Dodaj zarówno modyfikatory, static jak i public do deklaracji operatora (CS0558, CS9308). Język C# wymaga, aby wszystkie operatory zdefiniowane przez użytkownika były zarówno statyczne, jak i publiczne, dzięki czemu można je wywoływać bez instancji.
  • Przenieś deklarację operatora z klasy statycznej do klasy niestatycznej lub struktury (CS0715). Klasy statyczne nie mogą mieć wystąpień, więc operatory zdefiniowane przez użytkownika , które działają na wystąpieniach ich typu zawierającego, nie mają znaczenia w klasach statycznych.
  • Zastąp nieprawidłowy symbol operatora prawidłowym operatorem przeciążalnym (CS1037). Tylko określone operatory zdefiniowane przez język mogą być przeciążone.
  • Popraw składnię, aby postępować zgodnie z wymaganym formularzem operatora konwersji: public static implicit operator <dest-type>(<source-type> parameter) lub public static explicit operator <dest-type>(<source-type> parameter) (CS1553). Kompilator oczekuje, że operatory konwersji będą zgodne z określonym wzorcem deklaracji.

Aby uzyskać informacje o błędach związanych z jawnymi implementacjami interfejsów operatorów w statycznych interfejsach abstrakcyjnych, zobacz Statyczne błędy elementów członkowskich abstrakcyjnych i wirtualnych.

Niespójne ułatwienia dostępu

  • CS0056: Niespójna dostępność: typ zwracany "type" jest mniej dostępny niż operator "operator".
  • CS0057: Niespójna dostępność: typ parametru "type" jest mniej dostępny niż operator "operator".

Wszystkie typy używane w podpisie operatora publicznego muszą być co najmniej tak dostępne, jak sam operator. Aby zapoznać się z pełnymi regułami, zobacz Ograniczenia dotyczące modyfikatorów dostępu i ułatwień dostępu w specyfikacji języka C#.

  • Zmień typ zwracany na typ, który jest co najmniej tak dostępny jak operator, lub zmniejsz dostępność operatora, aby był zgodny z typem zwracanym (CS0056). Operator public nie może uwidocznić mniej dostępnego typu za pośrednictwem jego wartości zwracanej, ponieważ obiekt wywołujący poza zestawem nie byłby w stanie użyć wyniku.
  • Zmień typ parametru na typ, który jest co najmniej tak dostępny jak operator, lub zmniejsz dostępność operatora, aby był zgodny z typem parametru (CS0057). Operator public nie może wymagać mniej dostępnego typu jako parametru, ponieważ obiekt wywołujący poza zestawem nie byłby w stanie podać argumentu.

Ograniczenia konwersji zdefiniowane przez użytkownika

  • CS0552: Konwersja zdefiniowana przez użytkownika na/z interfejsu.
  • CS0553: Konwersja zdefiniowana przez użytkownika do/z klasy bazowej.
  • CS0554: konwersja zdefiniowana przez użytkownika na/z klasy pochodnej.
  • CS0555: Operator zdefiniowany przez użytkownika nie może przyjąć obiektu otaczającego typu i przekonwertować go na obiekt otaczającego typu.
  • CS0556: Konwersja zdefiniowana przez użytkownika musi zostać przekonwertowana na lub z otaczającego typu.
  • CS0557: Zduplikowana konwersja zdefiniowana przez użytkownika w typie.

Język C# ogranicza typy, które mogą uczestniczyć w konwersjach zdefiniowanych przez użytkownika. Aby uzyskać pełne reguły, zobacz Operatory konwersji zdefiniowane przez użytkownika i Operatory konwersji w specyfikacji języka C#.

  • Usuń operator konwersji, który konwertuje na lub z typu interfejsu (CS0552). Język zabrania konwersji zdefiniowanych przez użytkownika, które dotyczą typów interfejsów, ponieważ konwersje interfejsów są obsługiwane poprzez konwersje referencji i boksowanie w systemie typów. Zamiast tego należy użyć jawnych implementacji interfejsu lub metod pomocnika.
  • Usuń operator konwersji, który konwertuje na lub z klasy bazowej (CS0553). Konwersje między typem a jego klasą bazową już istnieją za pomocą niejawnych konwersji typów referencyjnych (upcast) i jawnych konwersji typów referencyjnych (downcast), więc konwersja zdefiniowana przez użytkownika tworzyłaby niejednoznaczność.
  • Usuń operator konwersji, który konwertuje na lub z klasy pochodnej (CS0554). Podobnie jak konwersje klas bazowych, konwersje między typem a jego typami pochodnymi są wbudowane w język poprzez dziedziczenie, a konwersje zdefiniowane przez użytkownika powodują konflikt z nimi.
  • Usuń operator konwersji, który konwertuje typ otaczający na siebie (CS0555). Każdy typ ma już niejawną konwersję tożsamości na siebie, więc konwersja zdefiniowana przez użytkownika z typu na ten sam typ jest nadmiarowa i niedozwolona.
  • Zmień jeden z typów operatora konwersji, tak aby typ źródłowy lub docelowy był typem otaczającym (CS0556). Konwersja zdefiniowana przez użytkownika musi obejmować typ, który go deklaruje — nie można zdefiniować konwersji między dwoma niepowiązanymi typami zewnętrznymi w trzecim typie.
  • Usuń zduplikowany operator konwersji lub zmień jeden z zduplikowanych operatorów, aby typy źródłowe i docelowe różniły się od innych (CS0557). Typ może zadeklarować tylko jedną niejawną i jedną jawną konwersję dla dowolnej pary typów źródłowych i docelowych.

Operatory logiczne i zwarciowe

  • CS0215: Zwracany typ operatora true lub false musi być wartością logiczną.
  • CS0216: Operator wymaga również zdefiniowanego operatora dopasowania.
  • CS0217: Aby można było go stosować jako operator zwarć, operator logiczny zdefiniowany przez użytkownika musi mieć ten sam typ zwracany co typ jego 2 parametrów.
  • CS0218: Typ musi zawierać deklaracje operatora true i operator false.

Język C# wymaga określonych par i podpisów dla operatorów logicznych i oceny zwarć obwodu. Aby uzyskać pełne reguły, zobacz operatory true i false, operatory logiczne i operatory warunkowe zdefiniowane przez użytkownika w specyfikacji języka C#.

  • Zmień typ zwracany wartości operator true i operator false na bool (CS0215). Te operatory określają, czy wartość jest logicznie prawdziwa, czy fałszywa, więc język wymaga od nich zwrócenia bool.
  • Zdefiniuj pasujący operator sparowany (CS0216). Język wymaga zadeklarowania niektórych operatorów w parach: operator == z operator !=, operator < z operator >, operator <= z operator >= oraz operator true z operator false.
  • Zmień typ zwracany operatora zdefiniowanego przez użytkownika & lub |, aby odpowiadał obu typom parametrów (CS0217). W przypadku oceny zwarciowej (&& i ||) kompilator wymaga, aby zwracany typ operatora & lub |, typy parametrów i typ zawierający były tego samego typu.
  • Dodaj zarówno deklaracje operator true i operator false do typu (CS0218). Kompilator przepisuje && i || za pomocą operator true, operator false oraz odpowiedniego operatora & lub |, więc wszystkie trzy muszą być obecne, aby ocena krótkiego przełączenia była możliwa.

Weryfikowane operatory

  • CS9023: Nie można sprawdzić operatora
  • CS9024: Nie można usunąć zaznaczenia operatora
  • CS9025: Sprawdzony operator wymaga również zadeklarowania zgodnej wersji, która nie jest sprawdzana
  • CS9027: Nieoczekiwane słowo kluczowe "unchecked"

checked i unchecked można stosować tylko do określonych deklaracji operatora. Aby zapoznać się z pełnymi regułami, zobacz Operatory arytmetyczne i Operatory zaznaczone przez użytkownika.

  • Usuń słowo kluczowe checked lub unchecked z nieobsługiwanego operatora (CS9023, CS9024). Tylko operatory arytmetyczne +, -, *, /, ++, -- i jawne operatory konwersji obsługują zaznaczone i niezaznaczone warianty. Inne operatory, takie jak operatory porównania lub równości, nie mają odrębnego zachowania w sytuacji przepełnienia i nie można ich oznaczyć jako sprawdzane ani niesprawdzane.
  • Dodaj niezweryfikowaną wersję operatora (CS9025). Operator checked zapewnia zachowanie rzutowania nadmiarowego, ale kompilator wymaga również odpowiedniej niezaznaczonej wersji do użycia w unchecked kontekstach i jako domyślnej, gdy żaden kontekst nie jest określony.
  • unchecked Usuń słowo kluczowe ze nieprawidłowej pozycji (CS9027). Słowo unchecked kluczowe w deklaracji operatora jest prawidłowe tylko jako część składni operatora (na przykład public static explicit operator unchecked int(MyType t)). Umieszczenie go w innym miejscu w deklaracji powoduje błąd składniowy.

Wymagania dotyczące interfejsu i dziedziczenia

  • CS9311: Typ nie implementuje elementu członkowskiego interfejsu. Typ nie może zaimplementować elementu członkowskiego, ponieważ jeden z nich nie jest operatorem
  • CS9312: Typ nie może zastąpić dziedziczonego członka, ponieważ jeden z nich nie jest operatorem
  • CS9313: Przeciążony operator przypisania złożonego przyjmuje jeden parametr

Kompilator wymusza ścisłe dopasowywanie między deklaracjami operatorów a elementami członkowskimi interfejsu lub składowymi klas bazowych, które implementują lub zastępują. Aby zapoznać się z pełnymi regułami, zobacz Przeciążanie operatorów i Interfejsy.

  • Zmień element członkowski implementujący na deklarację operatora zgodną z elementem członkowskim operatora interfejsu lub zmień element członkowski interfejsu na metodę, jeśli element członkowski implementujący jest metodą (CS9311). Operator może zaimplementować tylko taki element członkowski interfejsu, który jest również zadeklarowany jako operator — nie można spełnić umowy operatora za pomocą zwykłej metody, ani odwrotnie.
  • Zmień składową zastępowania na deklarację operatora zgodną z składową operatora klasy bazowej lub zmień składową klasy bazowej na metodę, jeśli składowa klasy pochodnej jest metodą (CS9312). Podobnie jak implementacja interfejsu, przedefiniowanie musi odpowiadać rodzajowi członka, który jest nadpisywany — operator nie może nadpisywać członka, który nie jest operatorem.
  • Zmień deklarację operatora przypisania złożonego, aby zaakceptować dokładnie jeden parametr (CS9313). Operatory przypisania złożonego to członkowie instancji, w których lewy operand jest domyślnie this, więc tylko operand prawy jest deklarowany jako parametr.

Operatory równości

  • CS0659: 'klasa' nadpisuje Object.Equals(object o), ale nie nadpisuje Object.GetHashCode()
  • CS0660: Typ definiuje operator == lub operator != ale nie zastępuje object.Equals(object o)
  • CS0661: Typ definiuje operator == lub operator != ale nie zastępuje object.GetHashCode()

Kompilator wymaga, aby przesłonięcia związane z równością i definicje operatorów pozostawały zsynchronizowane. Po zastąpieniu Object.Equals lub zdefiniowaniu operator == / operator != elementu należy również podać odpowiednie przesłonięcia. Aby zapoznać się z pełnymi regułami, zobacz Jak zdefiniować równość wartości dla typu oraz Operatory równości.

  • Dodaj przesłonięcie Object.GetHashCode kiedy przesłaniasz Object.Equals (CS0659). Kolekcje oparte na skrótach, takie jak Dictionary<TKey,TValue> i HashSet<T> opierają się na kontrakcie, że dwa obiekty, które są równe, muszą zwracać ten sam kod skrótu. Bez pasującego przesłonięcia GetHashCode, obiekty, które porównują się jako równe, mogą być skrótowane do różnych zasobników, co powoduje niewidoczne błędy wyszukiwania i deduplikacji.
  • Dodaj przesłonięcie Object.Equals gdy definiujesz operator == lub operator != (CS0660). Kod, który wywołuje Equals bezpośrednio — w tym wiele interfejsów API platformy, metod LINQ i operacji zbierania — nie będzie używać operatora niestandardowego. Bez spójnego Equals przesłonięcia te same dwa obiekty mogą być uznawane za równe przez ==, ale nie przez Equals, co prowadzi do nieprzewidywalnego zachowania.
  • Dodaj przesłonięcie Object.GetHashCode gdy definiujesz operator == lub operator != (CS0661). Podobnie jak CS0659, należy GetHashCode zachować spójność ze semantyką równości. Jeżeli operator == uznaje dwa obiekty za równe, ale zwracają różne kody skrótów, kolekcje oparte na skrótach nie będą działać poprawnie.

Błędy przepełnienia i niedomiaru

  • CS0031: Nie można przekonwertować wartości stałej na typ
  • CS0220: Operacja przepełnia się w czasie kompilacji w trybie sprawdzonym
  • CS0221: Nie można przekonwertować stałej wartości "value" na typ (użyj składni "unchecked" w celu zastąpienia)
  • CS0463: Ocena wyrażenia stałej dziesiętnej nie powiodła się z powodu błędu: "błąd"
  • CS0543: "wyliczenie": wartość modułu wyliczającego jest zbyt duża, aby zmieścić się w jego typie
  • CS0594: Stała zmiennoprzecinkowa znajduje się poza zakresem typu „type”
  • CS0652: Porównanie z stałą całkowitą jest bezużyteczne; stała znajduje się poza zakresem typu "type"
  • CS1021: Stała całkowita jest zbyt duża
  • CS8778: Stała wartość "value" może spowodować przepełnienie typu "type" w czasie wykonywania (użyj składni "unchecked" aby zignorować)
  • CS8973: Operacja może przepełnić się w czasie wykonywania (użyj składni "niezaznaczonej", aby zastąpić)

Kompilator ocenia wyrażenia stałe w czasie kompilacji i zgłasza błędy lub ostrzeżenia, gdy wartość przekracza prawidłowy zakres jego typu docelowego. Aby zapoznać się z pełnymi regułami, zobacz zaznaczone i niezaznaczone instrukcje i typy całkowite.

  • Zmień stałą wartość na taką, która mieści się w zakresie typu docelowego, lub zmień wartość docelową na większy typ liczbowy (CS0031). Kompilator nie może niejawnie zawęzić stałej, która nie pasuje — na przykład przypisanie 256 do byte elementu (zakres 0–255) powoduje ten błąd. Jeśli obcięcie jest zamierzone, użyj jawnego rzutowania w kontekście unchecked.
  • Popraw arytmetykę w wyrażeniu stałym, aby wynik pasował do typu docelowego, lub opakuj wyrażenie w kontekście unchecked, aby umożliwić ciche przepełnienie (CS0220). Kompilator ocenia całe wyrażenie stałe w czasie kompilacji w kontekście sprawdzanym domyślnie, więc wyniki pośrednie lub końcowe, które przekraczają zakres typu, powodują ten błąd.
  • Zmień wartość stałą lub typ docelowy, aby konwersja była prawidłowa, lub opatrz wyrażenie w kontekście unchecked, jeśli chcesz celowo uzyskać obcięty wynik (CS0221). W przeciwieństwie do CS0220 ten błąd dotyczy jawnych konwersji stałych, w których wartość źródłowa nie pasuje do typu docelowego.
  • Uprość lub podziel decimal stałe wyrażenie, aby pozostawało w zakresie i precyzji decimal typu (CS0463). Typ decimal ma maksymalną wartość wynoszącą około 7,9 \times 10^{28} i 28–29 cyfr znaczących, a kompilator przetwarza pełne wyrażenie w czasie kompilacji.
  • Zmień wartość składowej wyliczenia na taką, która pasuje do typu bazowego wyliczenia, lub zmień typ bazowy na większy typ całkowity (CS0543). Domyślnie wyliczenia używają int jako typu bazowego. Jeśli wartość elementu członkowskiego przekracza zakres typu bazowego, określ większy typ, taki jak long.
  • Zmień stałą zmiennoprzecinkową na wartość w zakresie typu docelowego lub użyj typu o wyższej precyzji, takiego jak double zamiast float (CS0594). Typ float obsługuje wartości do około $3.4 \times 10^{38}$, a double obsługuje do około $1.7 \times 10^{308}$.
  • Usuń lub popraw porównanie, aby stała mieściła się w zakresie typu zmiennej (CS0652). Porównywanie, na przykład, zmiennej i wartości byte300 nigdy nie może być prawdziwe, więc kompilator ostrzega, że porównanie jest bezużyteczne. To ostrzeżenie często wskazuje błąd logiki lub niezgodność między typem zmiennej a zamierzonym zakresem wartości.
  • Użyj większego typu liczbowego lub podziel wartość na wiele operacji (CS1021). Ten błąd występuje, gdy literał liczby całkowitej przekracza zakres nawet największego typu całkowitego (ulong, aż do $1,8 \times 10^{19}$). W przypadku wartości wykraczających poza ten zakres rozważ użycie elementu BigInteger.
  • Zawiń wyrażenie w unchecked kontekście, aby pominąć ostrzeżenie, lub zmień wartość, aby mieściła się w zakresie typu docelowego (CS8778). To ostrzeżenie wskazuje stałą konwersję, która może utracić dane w czasie wykonywania — kompilator nie może udowodnić, że przepełnienie na pewno nastąpi, ale identyfikuje ryzyko.
  • Zawiń wyrażenie w unchecked kontekście, aby pominąć ostrzeżenie, lub restrukturyzuj arytmetykę, aby uniknąć potencjalnego przepełnienia (CS8973). To ostrzeżenie jest podobne do CS8778 , ale dotyczy operacji arytmetycznych, a nie konwersji — kompilator wykrywa, że operacja może przepełnić się w czasie wykonywania.