未经检查不起作用

时间:2013-12-02 06:49:35

标签: c# overflow underflow

我只是在c#中尝试了一些示例问题并且遇到了以下问题

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Class1
    {
        public static int Add(int a, int b)
        { return a + b; }
        static void Main(string[] args)
        {
            byte myByte = 200;
            byte myInt = 100;
            byte ans;
            unchecked
            {
                ans = Convert.ToByte(myByte + myInt);
            }
            Console.WriteLine("Value of myByte: {0}", myByte);
            Console.ReadLine();


        }
    }
}

在上述情况下,即使在未经检查的块内发生下溢/溢出,它也会抛出异常。 请帮忙。

1 个答案:

答案 0 :(得分:4)

我认为你误解了unchecked阻止。它只会检查何时只是表达式会导致溢出或下溢。

在您的情况下,您正在调用Convert.ToByte方法。该方法可以抛出它想要的任何异常。这与unchecked阻止无关。

您的示例无效byte myInt = 300;将无法编译。试试这个,它不会抛出异常,因为我们使用表达式。

byte myByte = 0;
int myInt = 300;
unchecked
{
    myByte = (byte)(myInt + myByte);
}

另请注意,unchecked是c#中的默认值,因此您无需明确说出unchecked

<小时/> 为了更清楚,让我们创建自己的方法

private static void DoSomething(int a, int b)
{
    throw new OverflowException();
}

unchecked
{
    DoSomething(1,2);
}

那你在这里期待什么?要抛出OverflowException或CLR应该吃掉你的例外吗?