【问题标题】:How to get around use of unassigned variable that can never happen?如何避免使用永远不会发生的未分配变量?
【发布时间】: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中添加了说明。

标签: c# unassigned-variable


【解决方案1】:

更新

static bool IsValueGreaterThan500(object value)
{
    try
    {
        // Converts the value to int if it is not already an int
        // from bool, short, float, double, string, etc.
        return Convert.ToInt32(value) > 500;
    }
    catch
    {
        return false;
    }
}

【讨论】:

  • TypeScript 和这个问题有什么关系……?而且它肯定不是更聪明,它在这个 sn-p 中也会有同样的问题。 TypeScript 会更多冗长,因为模式匹配不是问题。
  • 我不知道 TypeScript 与它有什么关系,但这个答案的 c# 部分是可靠的:-)
  • TypeScript 在每个分支的静态类型分析期间进一步将真假区分为不同的类型,以便编译器知道 && 之后的表达式是否可以计算,从而知道如果 valueIsInt 为真,则必须分配 intValue .虽然你是对的,但没有模式匹配。
  • @TimTimWong 我在 TypeScript 操场上转换了提问者的代码,但没有观察到您描述的行为。我得到“在分配之前使用了变量'intValue'。”您所描述的内容听起来很奇妙。
  • 糟糕,我很困惑 TypeScript 中的类型缩小和类型保护是如何工作的。它只适用于条件分支的范围内。
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2021-06-04
  • 2017-06-21
相关资源
最近更新 更多