在循环中访问可为空的属性时,如何处理 ASP.NET Core Web API 中的空引用分配警告?

问题描述 投票:0回答:1

我有一个端点:

http://localhost:5235/ProductsEF/GetSubstances/ApapExtra

我得到结果的地方,例如

/ApapExtra

{
    "productId": 4,
    "productName": "ApapExtra",
    "substance1": "Paracetamolum",
    "substance2": "Coffeinum",
    "substance3": null,
    "substance4": null
}

我还有另一个端点:

http://localhost:5235/SubstancesEF/GetSubstanceDataByName/Paracetamolum

我在哪里获取数据,例如

/Paracetamolum

{
    "substanceId": 4,
    "name": "Paracetamolum",
    "effect": "Analgesic"
}

我想用一种方法将它们结合起来。我想创建一个方法:

[HttpGet("GetSubstances/{ProductName}")]
public Product GetSubstancesFromProduct(string ProductName)
{
    Product product = _productRepository.GetProductDataByName(ProductName);

    if (product == null)
    {
        throw new Exception("Could not find the product!");
    }

    List<Substance> substanceInfos = new List<Substance>();

    // string[] substanceNames = new string[] { product.Substance1, product.Substance2, product.Substance3, product.Substance4 };
    Console.WriteLine($"ProductName: {product.ProductName}");

    return product;
}

这一行:

Product product = _productRepository.GetProductDataByName(ProductName);

通向第一个端点。我想要实现的逻辑:

  1. 使用药物名称向此端点发送请求
  2. 药物正在分解成物质。
  3. 对于所有物质,发送请求以获取有关该物质的信息
  4. 返回物质信息列表。

所以我发送了请求

/ApapExtra
,我想得到:

{
    "substanceId": 4,
    "name": "Paracetamolum",
    "effect": "Analgesic"
}
{
    "substanceId": 4,
    "name": "Coffeinum",
    "effect": "Analgesic"
}

因为它由这些成分组成。

问题在于:

string[] substanceNames = new string[] { product.Substance1, product.Substance2, product.Substance3, product.Substance4 };

因为我得到:

可能的空引用分配。CS8601

即使我在模型中的字段名称旁边有

?

如何解决这个问题?或者如何更好的解决?

c# .net-core asp.net-core-webapi
1个回答
0
投票

您尝试将可为空属性的内容存储到不可为空字符串的数组中 (

substanceNames
)。

由于您的空引用检查,编译器知道

product
不为 null,但理解
product.Substance1
product.Substance2
product.Substance3
product.Substance4
可以为 null,因为您已将它们声明为 nullable 模型中带有
?

有多种方法可以解决此问题:

  • substanceNames
    的类型更改为可空字符串数组,即
    var substanceNames = new string?[] { product.Substance1, product.Substance2, product.Substance3, product.Substance4 };

  • 如果物质属性/字段不能为空,请从模型中删除

    ?
    ,以便它们不可为空,或者

  • 如果您确定它们为空,但您不更改模型,并且您希望在此特定场景中抑制有关这些属性/字段的所有可为空的警告,请使用

    !
    null-forgiving,或空值抑制,运算符
    var substanceNames = new string[] { product.Substance1!, product.Substance2!, product.Substance3!, product.Substance4! };

© www.soinside.com 2019 - 2024. All rights reserved.