C# 语句可达性和明确赋值

标签 c# variable-assignment

我被 csc 对这段代码的 react 难住了:

{
  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??
  }
}

在这段代码中,我得到了三个 if 和一个未初始化的局部变量 i。 CSC 足够聪明,可以容忍我在第一种和第二种情况下使用 i,因为它可以告诉代码无法访问正在使用 i 的位置。然而在第三种情况下,它提示 i 的增量“使用未分配的局部变量 i”。为什么它在前两个 ifs 中正确检测到 i 在无法访问的代码中,但在第三个 ifs 中却没有(这只不过是前两种情况的组合?

最佳答案

C# 5 规范的第 8.7.1 节对此进行了解释:

The first embedded statement of an if statement is reachable if the if statement is reachable and the boolean expression does not have the constant value false.

尽管我们可以推断出这种情况:

false && i < 30

总是false , 根据语言 (7.19) 的规则,它不是常量表达式,因此主体中的第一个嵌入语句是可达的。

并不是所有的事情都涉及&&是非假的。这很好,例如:

if (false && true)
{
    i++;
}

... 但是因为表达式 i < 30不是恒定的,您的原始表达式不是恒定的。情况就是这样,即使我们知道表达式永远不会被求值

语言可以决定任何&& LHS 具有常量表达式 false 的表达式也是一个常量表达式,值为 false ,但事实并非如此。 (这只会增加少量的复杂性,但 yield 水平真的很小。)

关于C# 语句可达性和明确赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500392/

相关文章:

Python 将条目列表分配给变量

c# - Visual Studio 2017 抛出异常中断(也处理异常)

python - AES265 Python 到 C# 转换失败

c# - 如何访问 Azure API 管理中设置变量策略中的请求正文?

python变量赋值 ":"

java - Java对象赋值是什么意思?

variables - Swift 中的多变量赋值

c# - WCF服务停止处理调用15秒钟

c# - 如何使用 ASP.NET Core 下载 png 文件

r - 如何以编程方式在数据框中分配一堆变量