【发布时间】:2021-12-31 03:56:33
【问题描述】:
ReadFromJsonAsync 方法返回可为空的 T。这是一个代码示例:
private async Task<T> Get<T>(Uri url, CancellationToken cancellationToken)
{
using HttpResponseMessage response = await _httpClient.GetAsync(url, cancellationToken);
T? body = await response.Content.ReadFromJsonAsync<T>(cancellationToken: cancellationToken);
return body ?? throw new Exception();
}
我希望我的方法返回不可为空的值。
我想知道ReadFromJsonAsync 什么时候会返回 null。无论我如何尝试,我仍然得到所有属性都等于 null 的 T 实例。所以我希望这样写代码是安全的:
return (T)body;
但现在我收到警告 将 null 文字或可能的 null 值转换为不可为 null 的类型。
这个怎么样,是不是个好主意:
return body!;
【问题讨论】:
-
@Ergis 可以肯定地说 ReadFromJsonAsync 返回的值永远不会为空吗?
-
@Ergis body.Value 不起作用:“T”不包含“Value”等的定义
-
@Ergis 错了,
T不是Nullable<T>。没有.Value。 -
我不认为它实际上可以返回 null 并且我不确定为什么它被写成返回一个可为空的引用而不是仅仅抛出。如果您选择
return body!;,那么如果它以某种方式为空,那么最终您将在第一次尝试尊重它时获得 NRE。另一方面,return body ?? throw new Exception()会立即抛出,我个人认为这是更好的做法。虽然我会使用InvalidOperationException之类的内容来显示有关失败的消息。 -
@walruz 我更新了我的评论。我的经验法则是尽可能少地使用 null 宽恕运算符。