执行和处理可空检查时如何解决空引用分配警告

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

有没有办法告诉编译器以下检查将确保 Item 不为 null 并且在代码的其余部分中是安全的并且不需要 CS8601 警告?

该警告在技术上是正确的,但不会认为它是在后续行中处理的,因此不需要生成警告。

Console.WriteLine("Hello, World!");

var test = new Test();
test.Init();

public class Test
{
    public record Item(string Name, int Total);

    public Item MyItem { get; set; } = null!;
    public int MyItemTotal { get; set; }

    public void Init()
    {
        MyItem = GetItems().FirstOrDefault();
        if (MyItem == null)
        {
            return;
        }
        else
        {
            MyItemTotal = MyItem.Total;
        }
    }

    private List<Item> GetItems()
    {
        return new List<Item>();
    }
}

在上面的代码中 MyItem = GetItems().FirstOrDefault(); 显示为警告,这在技术上是正确的。但是,以下行会进行检查并退出。我正在寻找一种方法来告诉编译器“我知道并且我正在处理它,无需警告。”

主要原因是我不想忽略警告,也不希望代码中到处都是编译指示。

有干净的方法吗?

编辑 下面是 Razor 网页上的一个示例,如果 MyItem 为 null,我们将重定向离开该页面。可以安全地假设在此代码中 MyItem 永远不会为 null。但由于 Item 不可为空,因此始终会显示警告。

public Item MyItem { get; set; } = null!;

public IActionresult OnGet()
{
    MyItem = GetItems().FirstOrDefault();
    if (MyItem == null)
    {
        return Redirect("/");
    }
        
    return Page();
}

c# roslyn-code-analysis nullable-reference-types
1个回答
0
投票

我正在回答自己,因为没有人发布该问题的答案。

在执行以下操作之前,请阅读评论。其中有一些关于可空性概念、测试、使用等的好信息。

在这种情况下,Razor 页面有一个入口点,它会检查是否为 null,如果属性为 null,则重定向离开。 IDE 不会考虑这一点,因此将永远警告您潜在的空错误。恕我直言,一个项目中的数百个警告会降低警告的效力,因为您将忽略它们。要删除警告,只需在最后敲击它即可删除警告。

MyItem = GetItems().FirstOrDefault()!;
if (MyItem == null)
{
   return Redirect("/");
}

例如,与在属性中相比,这样做的好处是,如果其他人要添加不同的入口点,他们将收到警告,并且必须确定适当的操作。

我熟悉通过敲击东西(🤔)来解决空警告和空性。我想我最初是这样做的,但遇到了一个错误,并认为它不起作用...没有意识到,因为它是一个异步方法,所以我需要将它括在括号中才能正确执行我想要的操作...duh.

MyItem = (await GetItemAsync())!;
© www.soinside.com 2019 - 2024. All rights reserved.