在验证方法中检查属性时 C# 不可为空的编译器警告

问题描述

我有一个类,该类的属性声明为 string? Email { get; set; }一个方法,如果电子邮件为空或 null 进行验证,该方法将返回 false。此方法中还有其他更复杂的检查,因此为简洁起见,我在下面将它们排除在外。尽管已检查电子邮件是否为空并且如果为空将返回 False,但编译器仍然抱怨它可能为空。


public string? Email { get; set; }

private bool IsFormValid()
{
   if (string.IsNullOrEmpty(Email))
   {
      return false;
   }

   return true;
}

public void Submit()
{
    if (IsFormValid()) 
    {
        Submit(Email);     // Compiler warns that Email may be null here
    }
}

编译器是否无法识别在这种情况下 Email 不会为空,或者我是否遗漏了什么?此时除了重新检查Email is not null,还有什么方法可以标记Email is not null?

public void Submit()
{
    if (IsFormValid() && Email is not null)   // I don't want to do this since it was already checked
    {
        Submit(Email);     
    }
}

解决方法

它不能那样工作,因为它可能是 null。自从您被另一个线程调用 Email 后,您如何确定 IsFormValid() 没有更改为 null?你要么决定你肯定在单线程上下文中并用 ! 覆盖警告,或者(首选)你获取对 Email 的本地引用,检查它然后将它传递给 { {1}}。

Submit

public void Submit() {
    if (IsFormValid())
    {
        Submit(Email!);
    }
}