C# 9+ 中的 HttpClient 空警告

HttpClient null warning in C# 9+

我刚刚将一个 .NET3.1 应用程序迁移到 .NET6(我使用的是 VS 2022),我注意到它们引入了一些与可空类型相关的约束。我修复了所有代码以遵循最佳实践,但不确定如何解决此问题:

创建新的 HttpClient 实例时,它 return 是一个可为 null 的 HttpClient 类型(代码在 Polly 重试策略中执行):

   public async Task<List<InterestedParty>> GetInterestedPartiesAsync()
    {
        return await _retryPolicy.ExecuteAsync(async () =>
        {
            using var client = new HttpClient()
            const string endpoint = "my-endpoint";
            var url = $"{endpoint}/test";

            var response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode();

            var jsonString = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<List<InterestedParty>>(jsonString);
        });
    }

编译器抱怨可能存在空引用 return。 我知道我可以通过使用来抑制警告:

#pragma warning disable CS8603 // Possible null reference return.

但我认为这不是最好的解决方案。

还有其他建议吗?谢谢。

问题本身与我一开始想的HttpClient无关

方法的 return 类型是 Task 并且在 using 语句中我是 returning

JsonConvert.DeserializeObject<List<InterestedParty>>(jsonString); 实际上,反序列化的对象可以为 null,因此一种解决方案是在末尾添加“null forgiving”运算符 (!):

   public async Task<List<InterestedParty>> GetInterestedPartiesAsync()
    {
        return await _retryPolicy.ExecuteAsync(async () =>
        {
            using var client = new HttpClient();
            const string endpoint = "my-endpoint";
            var url = $"{endpoint}/test";

            var response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode();

            var jsonString = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<List<InterestedParty>>(jsonString)!;
        });
    }

另一个更好的建议是:

  public async Task<IEnumerable<InterestedParty>> GetInterestedPartiesAsync()
{
    return await _retryPolicy.ExecuteAsync(async () =>
    {
        using var client = new HttpClient();
        const string endpoint = "my-endpoint";
        var url = $"{endpoint}/test";

        var response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode();

        var jsonString = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<List<InterestedParty>>(jsonString) ??
               Enumerable.Empty<InterestedParty>();
    });
}

感谢@JeroenMostert 和@DavidG 的建议。

在 .NET 6 的 .csproj 中,您可以设置可为空 disable:

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>disable</Nullable>
</PropertyGroup>