可为 null 的上下文在 C 中无法正常工作#

nullable context doesn't work properly in c#

提问人:TechDogLover OR kiaNasirzadeh 提问时间:6/27/2022 更新时间:6/27/2022 访问量:206

问:

我完全了解 nullabe 上下文以及如何在 C# 中处理它,即使这样,我也查看了这个 Microsoft 官方教程以及 stackoverflow 上的这个问题,但有一件事我真的无法弄清楚为什么!??
在启用了 null 上下文的代码中,以下代码工作正常且没有问题:

List<DateStepStatus> OperationOnTimeLine_success (List<DateStepStatus> timeLine)
{
    for (int i = 0; i < timeLine.Count; i++)
    {
        DateTime dateTime = timeLine[i].dateTime;
        if (DateTime.Today >= dateTime)
        {
            var abc = timeLine[i].stepStatus;
            if (abc is not null)
            {
                abc.Status = Status.Succeed;
            }

        }
        else continue;
    }
    return timeLine;
}

但是这段代码有一个警告:

List<DateStepStatus> OperationOnTimeLine_success (List<DateStepStatus> timeLine)
{
    for (int i = 0; i < timeLine.Count; i++)
    {
        DateTime dateTime = timeLine[i].dateTime;
        if (DateTime.Today >= dateTime)
        {
            if (timeLine[i].stepStatus is not null)
            {
                timeLine[i].stepStatus.Status = Status.Succeed;// bad-green warning goes under "timeLine[i].stepStatus" part
            }

        }
        else continue;
    }
    return timeLine;
}

这真的很烦人!如果我只是使用 VAR(如 ABC),警告就会消失,但如果我想直接做同样的事情,警告又回来了!

C# null nullreferenceexception 可以为 nullable-reference-types

评论

0赞 Jon Skeet 6/27/2022
你能提供一个最小的可重复的例子吗?有许多微妙之处可能会影响这一点。(老实说,我建议使用模式变量 - 那么你根本不需要表达式重复......但这是稍微不同的事情。
3赞 Klaus Gütter 6/27/2022
该语言不保证在多次调用 getter 时该属性返回相同的值。stepStatus
0赞 TechDogLover OR kiaNasirzadeh 6/27/2022
@KlausGütter,太好了,这似乎是合理的,如果你把这个作为答案发布,我会接受的,tnx

答:

2赞 Klaus Gütter 6/27/2022 #1

C# 语言不保证在多次调用 getter 时该属性返回相同的值。因此,对它进行一次 null 检查并不能证明它第二次不会为 null。stepStatus