我只是在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();
}
}
}
在上述情况下,即使在未经检查的块内发生下溢/溢出,它也会抛出异常。 请帮忙。
答案 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应该吃掉你的例外吗?