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

C# non-nullable compiler warning when property was checked in a validation method

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


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。自从另一个线程调用 IsFormValid() 后,您如何确定 Email 没有更改为 null?您要么确定您确定处于单线程上下文中并用 ! 覆盖警告,要么(首选)您对 Email 进行本地引用,检查它然后将其传递给 Submit.

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

public void Submit() {
    string? email = Email;
    if (IsFormValid() && email is not null) {
        Submit(email);
    }
}