警告 CS8600:将 null 字面值或可能为 null 的值转换为非可空类型。

4

无论我如何尝试,我都会得到以下警告。

严重性 代码 描述 项目 文件 行 抑制状态 警告 CS8600 将 null 字面量或可能为 null 的值转换为非可空类型。

代码如下。

HttpResponseMessage response = await _httpClient.PutAsync(url, requestContent);
string? userResponse = await response.Content.ReadAsStringAsync();
JsonSerializerOptions? options = new JsonSerializerOptions
{
  PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

//if (userResponse.Length > 0)
//{
  user = JsonSerializer.Deserialize<GetUserById>(userResponse, options);
//}

看了一些类似这个这个的帖子,但是无法解决问题。

更新。

我完全删除了if条件,但仍然收到警告。

更新2

按建议添加了空值检查。 但仍然收到该警告。

C#中的警告


在检查长度之前,您应该先检查userResponse是否为空。 - TheTanic
你在哪一行收到警告? - Thorkil Holm-Jacobsen
请查看我的答案,我在代码示例中添加了您遗漏的空值检查。 - mathis1337
你必须将字符串用作“string”吗? “string userResponse”仍然可以为null,您不必使用“string?”来指定它。 - Jan Macháček
4个回答

9

JsonSerializer.Deserialize 方法返回可空的 GetUserById 值。您正在将可空值分配给非可空字段/属性。

您有两个选项:


4
可以通过针对null值抛出异常来解决此问题。将user的类型设置为GetUserById(而不是GetUserById?),您在声明它不能为null,所以在最早的可能点上抛出异常将是正确的选择。
GetUserById user =
    JsonSerializer.Deserialize<GetUserById>(userResponse, options) ??
    throw new InvalidOperationException();

请注意,当字符串等于“null”时,JsonSerializer.Deserialize会返回null。请参见https://dev59.com/MsTra4cB1Zd3GeqP6mrD#72279451
从C# 8开始,您还可以使用null-forgiving operator。但是这通常不建议,因为如果该值为空,程序将在稍后的某个时间点失败。
GetUserById user = JsonSerializer.Deserialize<GetUserById>(userResponse, options)!;

在我看来,Deserialize 即使在任何解析错误的情况下都会抛出异常而不是返回 null,但它仍然返回可空引用,这是一个设计缺陷。 - Vinz

1
我认为它在警告你userResponse是空的,并且需要检查是否为空。如果你进行了空值检查,警告应该会消失。
如果你要使用userResponse.Length,请尝试以下内容:
HttpResponseMessage response = await _httpClient.PutAsync(url, requestContent);
var userResponse = (string?)null;
userResponse = await response.Content.ReadAsStringAsync();
JsonSerializerOptions? options = new JsonSerializerOptions
{
  PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

if (userResponse != null)
{
  user = JsonSerializer.Deserialize<GetUserById>(userResponse, options);
}

尝试了以下操作(在参数后面添加了!)。但仍然收到警告。user = JsonSerializer.Deserialize<GetUserById>(userResponse!, options!); - VivekDev
你需要进行实际的NULL检查,而不是说它可能为空。我将更新代码。 - mathis1337
仍然收到警告。请查看我的更新。 - VivekDev
它在抱怨哪一行代码?你能在示例中指出那一行吗? - mathis1337

1

JsonConvert.DeserializeObject 可能返回 null,因此接收变量应该是可空的,例如:

if (userResponse != null)
{
  var user? = JsonSerializer.Deserialize<GetUserById>(userResponse, options);
  if (user != null)
  {
    // Do stuff with non null user here...
  }
}

我检查返回的空对象最简单的方法就是:

if (JsonSerializer.Deserialize<GetUserById>(userResponse, options) is GetUserById user)
{
  // Do stuff with non null user here...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接