c# - 未选中只是与编译时错误有关吗?

标签 c#

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/

相关文章:

c# - 是否可以在 HTML5 Windows 8 Metro 应用程序中开发动态磁贴?

C# - 值 0.5 的数据类型

c# - 防止在 xamarin 和 monodroid 中旋转后重新加载 Activity

c# - 对象到/从 XML : generic Load and Save

c# - 有没有办法让窗口包含窗口中的自定义应用程序?

c# - 检测 TextBox 中的 Tab 键按下

C#:Base64编码

c# - IIS 回收事件后的 .NET 类型初始化异常

c# - 从继承自泛型接口(interface)的类中获取泛型参数的类型

c# - Firebird 和对批量查询的支持