未分配的局部变量是否保证 CS0165 C# 编译器错误?

Is CS0165 C# compiler error guaranteed for unassigned local variables?

在这样的代码中:

int val;

if (something())
   val = 10;

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

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

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

CS0165 是否保证在 C# 中使用此类代码?

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

Is CS0165 guaranteed for such code in C#?

是的,明确赋值的规则是为了让局部变量在明确写入之前永远不会被读取。

它也很保守 - 例如:

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

这里即使 我们 知道那些 if 语句体中的一个将被输入,编译器不会 - 所以 x 不是' t肯定在最后赋值。

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

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