0

我只是在 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();


        }
    }
}

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

4

1 回答 1

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应该吃掉你的异常?

于 2013-12-02T06:53:54.827 回答