Zaškrtnuté a nezaškrtnuté (referenční dokumentace jazyka C#)

Příkazy jazyka C# se můžou spouštět v zaškrtnutém nebo nezaškrtnutém kontextu. V zaškrtnutém kontextu vyvolá aritmetický přetečení výjimku. V nezaškrtnutém kontextu se aritmetické přetečení ignoruje a výsledek se zkrátí zrušením všech bitů s vysokým pořadím, které se nevejdou do cílového typu.

Console.WriteLine(int.MaxValue);           // 2147483647
Console.WriteLine($"0x{int.MaxValue:X}");  // 0x7FFFFFFF

Console.WriteLine(unchecked (int.MaxValue+1));          // -2147483648
Console.WriteLine($"0x{unchecked (int.MaxValue+1):X}"); // 0x80000000
Console.WriteLine(int.MinValue);                        // -2147483648
Console.WriteLine($"0x{int.MinValue:X}");               // 0x80000000

// Create overflow using compile-time constants:
// CS0220: The operation overflows at compile time in checked mode
// Console.WriteLine(checked (int.MaxValue+1));

try {
    checked 
    {
        var number = 1 + int.MaxValue / 2;
        number += number;
    }
} catch (OverflowException e)
{
    Console.WriteLine("This operation overflows at runtime in checked mode.");
}

V zaškrtnutém režimu vygeneruje jakýkoli konstantní výraz, který přeteče nebo podtečení, chybu kompilátoru. Jakýkoli výraz, který přeteče za běhu, vyvolá System.OverflowException. V nezaškrtnutém režimu se zabalí z maximální hodnoty na minimální hodnotu.

Kontrola přetečení ovlivňuje následující operace:

  • Výrazy používající následující předdefinované operátory pro integrální typy:

    ++, unární -, --+, , -, , , */

  • Explicitní číselné převody mezi integrálními typy nebo z float nebo double do celočíselného typu

Počínaje jazykem C# 11 můžete definovat variantu checked pro operátory ovlivněné kontrolou přetečení. Pokud definujete checked operátor, musíte také definovat operátor bez klíčového checked slova. Další informace o zaškrtnutých a nezaškrtnutých operátorech najdete v tématu Aritmetické operátory.

Pokud ani checkedunchecked není zadán, výchozí kontext pro nekonstanční výrazy (výrazy, které se vyhodnocují za běhu) jsou definovány hodnotou kompilátoru CheckForOverflowUnderflow . Ve výchozím nastavení je hodnota této možnosti neset aritmetické operace spuštěna v nezaškrtnutém kontextu.

Pro konstantní výrazy (výrazy, které lze plně vyhodnotit v době kompilace), je výchozí kontext vždy kontrolován. Pokud není konstantní výraz explicitně umístěný v nezaškrtnutém kontextu, přeteče, ke kterým dochází během vyhodnocení doby kompilace výrazu, způsobují chyby v době kompilace.

Viz také