【问题标题】:Go from nullable to non-nullable after ReadFromJsonAsync在 ReadFromJsonAsync 之后从可空变为不可空
【发布时间】: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&lt;T&gt;。没有.Value
  • 我不认为它实际上可以返回 null 并且我不确定为什么它被写成返回一个可为空的引用而不是仅仅抛出。如果您选择return body!;,那么如果它以某种方式为空,那么最终您将在第一次尝试尊重它时获得 NRE。另一方面,return body ?? throw new Exception() 会立即抛出,我个人认为这是更好的做法。虽然我会使用 InvalidOperationException 之类的内容来显示有关失败的消息。
  • @walruz 我更新了我的评论。我的经验法则是尽可能少地使用 null 宽恕运算符。

标签: c# nullable .net-6.0


【解决方案1】:

ReadFromJsonAsync 是一种实用方法,它获取响应的内容流,然后将其传递给JsonSerializer.DeserializeAsync

DeserializeAsync 被定义为返回可空值,因为它可能返回空值。它会在您尝试反序列化 null JSON 值的情况下执行此操作。

如果您不期望这些,那么您可以使用! 来忽略警告。但最安全的方法是确实检查 null 并抛出异常或返回后备值。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2023-01-17
    • 2019-07-15
    • 2019-07-18
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多