VS.NET 2010对C#常量表达式的评估

时间:2012-08-14 14:42:55

标签: c# visual-studio

当我在Visual Studio中的C#中尝试使用示例表达式

public int Test()
{
    if (10/2 == 5)
        throw new Exception();
    return 0;
}

当我保持表达式10/2 == 5时,vs.net会自动发出警告“检测到无法访问的代码”。

如果我改变表达式10/2 == 6,IDE很高兴吗?它是如何发生的?

编辑:对不完整的问题抱歉。即使在编译代码之前,它也会立即发生并发生?

我已经对每个回复进行了投票,并接受了基于FIFO的第一个答案

7 个答案:

答案 0 :(得分:9)

if (10/2 == 5)

将始终返回true,这意味着

throw new Exception();

将永远执行,

return 0;

永远不会到达

答案 1 :(得分:4)

如果您反编译此代码,最终会得到:

public int Test()
{
     throw new Exception();
}

我相信因为这些是常量值,所以数学是在编译时完成的,所以10/2实际上不是10/2,而是5 ......所以编译器实现5 ==会变得微不足道5总是如此。事实上,我相信这些常量会自动转换为真。编译器的目标是优化总是重复的代码并在编译时运行它的处理,而不是一遍又一遍地运行相同的处理。

所以,基本上,编译器意识到,因为if始终是true而if导致return(通过throw),所以它优化了它的代码知道永远不会被执行。因此,反编译的代码导致上述内容。

事实上,如果你执行10/2 == 6,则会发生相反的情况,public int Test() { int num = 0; return num; } 被“限定”为5 == 6,后者变为false。由于if始终为false,因此优化if:

{{1}}

答案 2 :(得分:4)

正如其他人所说,编译器可以评估表达式10 / 2 == 5编译时,因为它是常量表达式。它的计算结果为true,因此if范围之后的任何代码都不可用。如果更改为false,则<{1}}内的内的代码无法访问。

现在考虑一下这段代码:

if

这两种方法都会生成关于无法访问的代码的警告!

关于C#编译器的一个奇怪的事情是,如果无法访问的代码完全由public int TestA() { if (10 / 2 == 5) return 1; return 0; } public int TestB() { if (10 / 2 == 6) return 1; return 0; } 语句组成,那么将发出 no 警告,说明不可修复的问题。

其他:This Stack Overflow question is related

答案 3 :(得分:3)

正在抱怨该行

return 0;

永远无法联系到。 10/2总是等于5.

答案 4 :(得分:2)

在第一种情况下,编译器处理表达式10/2 == 5,其计算结果为true,因此抛出异常并且return 0语句无法访问。

在第二种情况下,10/2 == 6的计算结果为false,因此return 0语句是可以访问的,因为不会抛出异常。

响应您的编辑:您的代码不必为编译器实际编译,以便知道代码行无法访问。很聪明地知道10/2 == 5始终为真,无论用户输入是什么,这意味着将始终抛出异常。

答案 5 :(得分:1)

编译器足够智能(这是一个非常简单的检查)并确定永远不会达到返回0。这是因为10/2 == 5将永远为真。根据编译器,以下表达式同等地评估

if (10/2 == 5)

if true

编译器能够确定这一点的原因是因为数字不是变量

答案 6 :(得分:1)

事实上,他知道他永远不会进来 返回0

他只是警告说10/2 = = 5以下的整个代码永远不会被解释为10/2总是5。

以同样的方式:

if (true)
{
     ......
}
else 
{
  .....
}