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>
我刚刚将一个 .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>