【发布时间】:2020-07-29 22:07:58
【问题描述】:
在下面的代码中,编译器在返回行的“intValue”上给出了“使用未分配的局部变量”。但是,不会出现“intValue > 500”会被取消分配的情况(因为如果intValue未分配,则valueIsInt为false,并且该语句在达到intValue之前返回false)
有没有办法在不修改代码的逻辑或业务逻辑的情况下解决这个问题?这是一个非常简化的例子;在intValue 是另一种类型并且条件intValue > 500 更复杂的情况下,我们不能像intValue = 0 那样在else 块中简单地给intValue 一个值
bool valueIsInt;
if (value is int intValue)
{
valueIsInt = true;
}
else
{
valueIsInt = false;
}
return valueIsInt && intValue > 500;
我想避免这种情况,以防 else 语句中的代码更复杂:
else
{
return false;
}
比如这样:
bool valueIsInt;
if (value is int intValue)
{
valueIsInt = true;
}
else
{
if (value is string stringValue)
valueIsInt = int.TryParse(stringValue, out intValue);
else
return false;
}
return valueIsInt && intValue > 500;
【问题讨论】:
-
只是设置一个初始值? bool valueIsInt = false;
-
你知道你可以写成
return value is int intValue && intValue > 500;,对吧?我的意思是,我知道您编写的示例是简化的,如果它与您的代码在任何方面都相似,您可能至少可以重写部分代码 -
见this answer - “一些变量没有被归类为初始赋值;特别是局部变量没有被初始赋值。编译器必须将它们归类为“明确赋值” 在使用它们的值的所有点。" 以及进一步的 "这在 C# 中是非法的原因是因为使用未分配的本地很可能是一个错误. 我们只是将其设为非法,然后编译器会阻止您出现此类错误”
-
不完全是重复的,但这里是question asking why this happens.
-
为了澄清,针对这些cmets:我知道代码的sn-p可以简化,这不是问题,虽然我感谢你的好意,但建议不要回答我真正的问题。我在问题iteslef中添加了说明。