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

Has*_*Dew 5 .net c# asp.net .net-5

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Cai*_*ard 5

从 .Net core 3.1 迁移到 .Net 5 后显示错误“使用未分配的局部变量”

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

在此输入图像描述您真的确定代码可以在 netcore3.1 中运行吗?

看起来这是编译器无法判断变量已被明确赋值的情况之一 - 请参阅此处的“条件访问合并到布尔常量” 。您可能需要重写代码来解决这个问题:

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;
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ore 3

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

return Guid.TryParse(values.FirstOrDefault(), out customerId);
Run Code Online (Sandbox Code Playgroud)

永远不会执行,除非_contextAccessor.HttpContext是 non- nullTryGetValue被调用并被values赋值。

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

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

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