为什么算术运算符有明显的溢出,但为什么没有编译时错误

时间:2018-12-31 14:30:25

标签: c# .net-core

在C#中使用算术运算符时,我注意到没有编译时错误,但是有明显的运行时错误。 将整数类型相互转换时,是否有任何方法可以将这种溢出异常作为编译时错误注意到?

static void Main(string[] args)
{
    byte[] myArray = new byte[10];

    for (byte counter = 0; counter < myArray.Length; counter++)
    {
        myArray[counter] = Convert.ToByte(counter + 300);
    }

    foreach (int member in myArray)
    {
        Console.WriteLine(member);
    }
 }

很显然,当您运行此代码时,因为它将尝试在一个字节中存储一个超过300的值,由于其256个限制,您将获得OverflowException。

1 个答案:

答案 0 :(得分:2)

请注意,编译器只会看到

public static byte ToByte (int value);

使编译器“了解” ToByte()方法是一项功能请求。 该功能将永远是不完整的。 byte.Parse("300")怎么样?

要求编译器捕获强制转换,如

myArray[counter] =  (byte) (counter + 300);

但它也不会这样做。 counter可能是-200。

在这种情况下,它知道counter的范围,因为它属于for循环。但是应该检查多少个代码路径?这将是一个仅在某些时间有效的功能。