MSDN examples只是编译时错误。
只是我看到@JonSkeet在这里使用它作为答案:https://stackoverflow.com/a/263416/360211如果只是编译时间,我不明白为什么。
static void Main()
{
const int x = 4;
int y = int.MaxValue;
int z = x*y;
Console.WriteLine(z);
Console.ReadLine();
}
产生-4
,与此相同:
static void Main()
{
unchecked
{
const int x = 4;
const int y = int.MaxValue;
int z = x*y; // without unchecked, this is compile error
Console.WriteLine(z);
Console.ReadLine();
}
}
这会引发运行时:
static void Main()
{
checked
{
const int x = 4;
int y = int.MaxValue;
int z = x*y; //run time error, can checked be set system wide?
Console.WriteLine(z);
Console.ReadLine();
}
}
Jon 这样做是因为它可以在系统范围内设置、编译器标志或其他方式吗?
最佳答案
无论操作是在checked
还是unchecked
block 中,都会在实际计算值时执行。当两个变量相乘/相加时,这几乎总是在运行时发生,因为它们在编译时是未知的。
在您的示例中,两个变量都是常量;这意味着编译时文字之间的计算结果可以在编译时完成(确实如此)。由于结果是在编译时计算的,并且它不在 unchecked
block 中,因此无法在没有错误的情况下计算结果。这并不意味着选中/未选中的 block 通常是编译时检查;他们很少这样做。
是的,可以更改项目属性以确定整个代码库是否处于已检查/未检查上下文中。如果您正在编写一个库,也可以从任一上下文中调用该方法。因此,如果有一个代码块必须在已检查或未检查的上下文中运行,那么添加这样的代码块是一个很好的做法,即使您当前的项目设置对于该方法来说是正确的。另外,如果不出意外的话,它会让 future 的读者更清楚该代码片段的意图,“此方法依赖于整数溢出”,而不是“此方法决不能溢出。”
关于c# - 未选中只是与编译时错误有关吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13420029/