【问题标题】:Why does a try/finalize block does not throw CS0165: Use of unassigned local variable compilation error?为什么 try/finalize 块不抛出 CS0165: Use of unassigned local variable 编译错误?
【发布时间】:2021-01-28 14:13:28
【问题描述】:

为什么variant_1 会编译,而variant_2 会像预期的那样以CS0165: Use of unassigned local variable 失败?我想也许最终将未分配的变量初始化为默认值,但我没有看到这种情况发生。

我用.NET Core 3.1 运行了这段代码

static string variant_1()
{
    string str;

    try
    {
        str = "grrr";
    }
    finally
    {

    }

    return str; //no problem ?
}

static string variant_2()
{
    string str;

    try
    {
        str = "grrr";
    }
    catch (Exception ex)
    {

    }

    return str; //does not compile: `CS0165: Use of unassigned local variable`
}

【问题讨论】:

  • @Selvin:不明白你的评论
  • 所以有this,它解释了为什么“try”和“catch”可能不会被执行,但是你的“finally”是空的,所以这不是一个完整的答案。
  • @Veverke 差异...乍一看很难找到差异
  • 如果在分配给str 之前发生异常,控制流永远不会到达return 语句。
  • @Damien_The_Unbeliever:不应该同样适用于 try/finally 变体吗?

标签: c# .net try-catch


【解决方案1】:

让我们想象一下这里可能会发生一些不好的事情:

static string variant_2()
{
    string str;

    try
    {
        //Something bad happens
        str = "grrr";
    }
    catch (Exception ex)
    {

    }

    return str; //does not compile: `CS0165: Use of unassigned local variable`
}

也许是ThreadAbortException。也许是别的东西。怎么了?控制流进入catch,然后函数的其余部分执行str 从未被分配。

但是对于finally 的情况,如果发生任何异常,控制流可能会进入finally,但随后它退出方法return 永远不会遇到。通过try/finally 块继续到return 的唯一路径是在try 部分中没有发生异常,因此必须在其中进行分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2019-03-20
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    相关资源
    最近更新 更多