问题描述
我有一个类,该类的属性声明为 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!);
}
}