【问题标题】:Is CS0165 C# compiler error guaranteed for unassigned local variables?未分配的局部变量是否保证 CS0165 C# 编译器错误?
【发布时间】:2018-07-03 12:11:02
【问题描述】:

在这样的代码中:

int val;

if (something())
   val = 10;

val++; // Error CS0165 Use of unassigned local variable

当使用局部变量时,我收到CS0165 错误消息,而它之前可能没有被确定初始化。

在 C++ 世界中,这种情况是未定义的行为类情况,这意味着任何事情都是允许的。所以也许有编译器错误,也许有编译器警告,也许有运行时错误,也许代码只是使用了当时内存中的任何内容,祝你好运。

C# 中的此类代码是否保证 CS0165

是否存在此特定代码不产生错误消息的情况?

【问题讨论】:

    标签: c# .net compiler-errors language-lawyer static-analysis


    【解决方案1】:

    C# 中的此类代码是否保证 CS0165?

    是的,明确赋值的规则是这样设计的,即局部变量在被明确写入之前永远不能被读取。

    这也是相当保守的——例如:

    bool condition = false;
    int x;
    if (condition)
    {
        x = 0;
    }
    if (!condition)
    {
        x = 1;
    }
    Console.WriteLine(x); // Error
    

    尽管我们知道将输入其中一个if 语句体,但编译器却不知道 - 所以x 并没有在最后被确定。 p>

    明确赋值的规则在 C# 5 规范的 5.3 节中。

    请注意,各种类型的变量(例如静态字段和类的实例字段)被视为“初始分配” - 但它们具有明确指定的默认值,因此那里仍然没有未定义的行为。

    【讨论】:

    • 使用else 而不是第二个if 将使编译器可以检查哪些行为没有未定义的行为。
    • @Sinatr 是的,这是故意设计为示例,规则未涵盖但人类常识涵盖。但这与未定义的行为无关 - 这是明确的分配。
    猜你喜欢
    • 2019-11-08
    • 2018-12-19
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2019-06-29
    • 2019-09-01
    相关资源
    最近更新 更多