【问题标题】:After migrating to .NET 5 shows an error "Use of unassigned local variable" for out parameter迁移到 .NET 5 后,输出参数显示错误“使用未分配的局部变量”
【发布时间】:2021-12-30 08:25:50
【问题描述】:
public bool TryGetCustomerId(out Guid customerId)
{
    customerId = Guid.Empty;
    if (_contextAccessor.HttpContext?.Request.Headers.TryGetValue(CustomKnownHeaders.CustomerId,
        out var values) ?? false)
    {
        return Guid.TryParse(values.FirstOrDefault(), out customerId);
    }

    return false;
}

从 .NET Core 3.1 迁移到 .NET 5 后,输出参数变量显示错误“使用未分配的局部变量”。

错误显示在“值”变量中。 错误 - “使用未分配的局部变量‘值’”

【问题讨论】:

  • TryGetValue(...) ?? false 看起来很奇怪,因为TryGetValue() 返回的bool 永远不是null。如果你去掉?? false 部分会发生什么?
  • @Xiang 但是HttpContext?. 可能已经向那里传播了一个空值
  • @CaiusJard 啊,确实!抱歉,错过了那个问号。
  • 出于好奇,为什么不迁移到 .NET 6?

标签: c# asp.net .net .net-5


【解决方案1】:

从 .Net core 3.1 迁移到 .Net 5 后显示错误“Use of unassigned local variable”

我在 netcore3.1 中测试了类似的东西,得到了同样的错误..

你确定代码在netcore3.1中可以运行吗?

看起来这是编译器无法确定变量已被明确分配的情况之一 - 请参阅“条件访问合并到布尔常量”here。你可能需要重写你的代码来帮助它:

public bool TryGetCustomerId(out Guid customerId)
{
    customerId = Guid.Empty;
    string[] values = null;
    if (_contextAccessor.HttpContext?.Request.Headers.TryGetValue(CustomKnownHeaders.CustomerId,
        out values) ?? false)
    {
        return Guid.TryParse(values.FirstOrDefault(), out customerId);
    }

    return false;
}

【讨论】:

  • 嘿,是的,它在 .Net core 3.1 中工作。但不在 .Net 5 中
  • @Hash_Dew:无论如何,这应该可以解决这个问题。您是否尝试过建议的代码来显式初始化变量?
【解决方案2】:

这似乎是编译器中的错误或至少是限制。它显然没有意识到这一行:

return Guid.TryParse(values.FirstOrDefault(), out customerId);

除非_contextAccessor.HttpContext 不是null,否则永远不会执行,TryGetValue 被调用并且values 被赋值。

值得注意的是,将?? false 更改为== true(这是我通常处理这种确切情况的方式)并没有什么不同。显然,TryGetValue 可能不会被调用这一事实足以让编译器将任何后续使用 values 视为可能未分配,即使 values 不能在使用它的唯一分支中未分配。

除了编译器中的错误之外,很难将其视为应该在https://github.com/dotnet/roslyn 报告的错误。

编辑 这在 Visual Studio 2022 中似乎不是问题(即使在 .NET5 项目中),因此似乎 MS 确实认识到了这个错误并修复了它。我只在使用 2019 打开和编译项目时看到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多