有没有办法告诉编译器以下检查将确保 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();
}
我正在回答自己,因为没有人发布该问题的答案。
在执行以下操作之前,请阅读评论。其中有一些关于可空性概念、测试、使用等的好信息。
在这种情况下,Razor 页面有一个入口点,它会检查是否为 null,如果属性为 null,则重定向离开。 IDE 不会考虑这一点,因此将永远警告您潜在的空错误。恕我直言,一个项目中的数百个警告会降低警告的效力,因为您将忽略它们。要删除警告,只需在最后敲击它即可删除警告。
MyItem = GetItems().FirstOrDefault()!;
if (MyItem == null)
{
return Redirect("/");
}
例如,与在属性中相比,这样做的好处是,如果其他人要添加不同的入口点,他们将收到警告,并且必须确定适当的操作。
我熟悉通过敲击东西(🤔)来解决空警告和空性。我想我最初是这样做的,但遇到了一个错误,并认为它不起作用...没有意识到,因为它是一个异步方法,所以我需要将它括在括号中才能正确执行我想要的操作...duh.
MyItem = (await GetItemAsync())!;