проверка и un проверка ed statements (справочник по C#)

unchecked Инструкции checked указывают контекст переполнения проверка для арифметических операций и преобразований целочисленного типа. Когда происходит арифметическое арифметическое переполнение, контекст переполнения проверка определяет, что происходит. В проверка контексте возникает исключение; System.OverflowException если переполнение происходит в константном выражении, возникает ошибка во время компиляции. В не проверка контексте результат операции усечен карта любых битов высокого порядка, которые не соответствуют типу назначения. Например, в случае сложения он упаковывается из максимального значения к минимальному значению. В следующем примере показана одна и та же операция как в проверка, так и в контексте без изменений проверка:

uint a = uint.MaxValue;

unchecked
{
    Console.WriteLine(a + 3);  // output: 2
}

try
{
    checked
    {
        Console.WriteLine(a + 3);
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

Примечание.

Поведение определяемых пользователем операторов и преобразований в случае переполнения может отличаться от того, что описано в предыдущем абзаце. В частности, определяемые пользователем операторы проверка могут не вызывать исключение в проверка контексте.

Дополнительные сведения см. в разделах арифметического переполнения и деления по нулю и определяемым пользователем проверка операторам статьи арифметических операторов.

Чтобы указать контекст переполнения проверка для выражения, можно также использовать checked операторы и unchecked операторы, как показано в следующем примере:

double a = double.MaxValue;

int b = unchecked((int)a);
Console.WriteLine(b);  // output: -2147483648

try
{
    b = checked((int)a);
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

Операторы checked и unchecked операторы влияют только на контекст переполнения проверка для этих операций, которые текстуально находятся внутри блока инструкций или круглых скобок оператора, как показано в следующем примере:

int Multiply(int a, int b) => a * b;

int factor = 2;

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, int.MaxValue));  // output: -2
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);
}

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, factor * int.MaxValue));
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

В предыдущем примере первый вызов локальной функции показывает, что checked инструкция не влияет на контекст Multiply переполнения Multiply проверка в функции, так как исключение не возникает. При втором вызове Multiply функции выражение, вычисляющее второй аргумент функции, вычисляется в проверка контексте и приводит к исключению в текстовом виде внутри блока инструкцииchecked.

Операции, затронутые контекстом переполнения проверка

Контекст переполнения проверка влияет на следующие операции:

Контекст переполнения проверка по умолчанию

Если контекст переполнения проверка не указан, значение параметра компилятора CheckForOverflowUnderflow определяет контекст по умолчанию для неконстантных выражений. По умолчанию значение этого параметра не задано, а арифметические операции целочисленного типа и преобразования выполняются в не проверка контексте.

Константные выражения оцениваются по умолчанию в проверка контексте, а в случае переполнения возникает ошибка во время компиляции. Вы можете явно указать контекст без проверка для константного выражения с оператором или операторомunchecked.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

См. также