提问者:小点点

C#可为空检查验证属性不为空


我有一个复杂的对象我想检查是否有效。我有一个方法来检查它,但是C#可为空性检查不知道它们:

#nullable enable
...

bool IsValid(Thing? thing) 
{
    return thing?.foo != null && thing?.bar != null;
}

...

if(IsValid(thing)) 
{
   thing.foo.subProperty; // CS8602 warning: foo is possibly null here

有没有办法在这里应用类似TypeScript的类型门的东西?如果isvalid为true,那么我们知道thing.foo不是null,但是C#分析器看不到函数内部。如果我内联检查它可以,但我是复制粘贴代码,这是一个简单的例子。

是否有任何注释或模式,我可以有空性分析与更复杂的检查?


共1个答案

匿名用户

您可以像这样使用null-forgening运算符:

if (IsValid(thing))
{
    thing.foo!.subProperty;
}

正如@JeroenMostert所指出的,虽然它不能帮助您使用foo,但另一种选择是NotNullWhen属性。

编译器知道thing在这里不是null,但是foo可能仍然是null

bool IsValid([NotNullWhen(true)] Thing? thing)
{
    return thing?.foo != null && thing?.bar != null;
}

if (IsValid(thing))
{
    thing.foo;
}