ADA*_*MJR 5 c# integer-overflow
我在 C# 中进行单元测试,发现以下代码给出了溢出异常:
using System;
public class Program
{
public static void Main()
{
int i = 0;
Console.WriteLine(new float[i - 1]);
// System.OverflowException: Arithmetic operation resulted in an overflow.
}
}
Run Code Online (Sandbox Code Playgroud)
https://dotnetfiddle.net/clbgZ3
但是,如果您显式尝试初始化负数组,则会收到以下错误:
Console.WriteLine(new float[-1]);
// Compilation error: Cannot create an array with a negative size
Run Code Online (Sandbox Code Playgroud)
为什么初始化负大小的数组会导致溢出异常,而不是其他类型的错误?
这不是堆栈溢出,而是数字溢出:-1 超出了合法值(可能是无符号整数)。有关确切的语言规范,请参阅orhtej2的答案。
同样的异常也会发生:
int i = -1;
checked
{
uint ui = (uint)i;
// Arithmetic operation resulted in an overflow.
}
Run Code Online (Sandbox Code Playgroud)
您确实需要checked出现此错误的上下文,否则只会复制这些位(并且该值将为 4294967295)。
关于不同的错误:第一个是运行时异常,第二个是编译器错误。
此行为在 C# 语言规范第 12.8.16.5节中明确指定
数组创建表达式的求值结果被归类为值,即对新分配的数组实例的引用。数组创建表达式的运行时处理包括以下步骤:
(...)
- 验证维度长度的计算值,如下所示:如果一个或多个值小于零,
System.OverflowException则抛出 a 并且不执行进一步的步骤。
(强调我的)
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |