为什么 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)
的情况下处理得很好呢?您总是可以将分析器做得更复杂,但保持简单也有其价值。
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)
的情况下处理得很好呢?您总是可以将分析器做得更复杂,但保持简单也有其价值。