Mis*_*hax 4 c# variable-assignment
我对csc对此代码的反应感到困惑:
{
int i;
if (false)
{
i++; // uninitialized, but allowed by compiler
}
if (false && i < 30) // uninitialized, but allowed by compiler
{
}
if (false && i < 30) // uninitialized, but allowed by compiler
{
i++; // NOT ALLOWED by compiler??
}
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我有三个ifs和一个未初始化的局部变量i.CSC非常聪明,可以容忍我在第一和第二种情况下使用i,因为它可以告诉代码我在哪里使用是无法访问的.然而在第三种情况下,它抱怨i"使用未分配的局部变量i"的增量.为什么正确检测到i在前两个ifs中是无法访问的代码,而不是在第三个ifs中(这只是前两种情况的组合?
这可以通过C#5规范的第8.7.1节来解释:
if如果if语句可达且布尔表达式没有常量值,则可以访问语句的第一个嵌入语句false.
即使我们可以推断出这种情况:
false && i < 30
Run Code Online (Sandbox Code Playgroud)
总是false,它不是根据语言规则(7.19)的常量表达式,因此正文中的第一个嵌入语句是可达的.
并非所有涉及的&&都是非假的.这很好,例如:
if (false && true)
{
i++;
}
Run Code Online (Sandbox Code Playgroud)
...但因为表达式i < 30不是常数,所以原始表达式不是常数.即使我们知道表达式永远不会被评估,情况也是如此.
语言可以决定&&LHS具有常量表达式的任何表达式false也是值的常量表达式false,但事实并非如此.(这只会增加一小部分复杂性,但效益水平确实很小.)
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |