为什么 C# 中的局部变量必须在初始化后初始化并在 If 运算符条件中强制转换?

Why local variable in C# must be initialized after initializing and cast inside If operator condition?

public void A()
{
    if (!(_s is string v))
        return;

    Console.WriteLine(v);
}

这段代码编译良好
但是

public void A()
{
    if (false == _s is string v)
        return;

    Console.WriteLine(v); <-- 'Local variable 'v' might not be initialized before accessing'
}

但是这个returns编译器错误
什么原因?

流量分析不完善。

if (true == _s is string v)
  Console.WriteLine(v); 

同样失败。

明确分配流分析是保守的——其目的是确保您无法读取未分配的本地。希望它也能够找出在给定一组条件下永远无法到达的分支,但这是一个奖励。

对于false == _s is string v的情况,最终还是需要具体分析。但是,为什么在没有理由不使用 !(_s is string) 的情况下处理得很好呢?您总是可以将分析器做得更复杂,但保持简单也有其价值。