关于c#:??


?? Operator - Using in one liner condition

有人能解释一下下面的语句是如何操作的吗?我知道吗??如果第一个参数不为空,则返回该参数。但当我看到这个的时候,我有点困惑。在"file"变量后面。

1
return file?.ImportStatus ?? ImportStatusEnum.Unknown;


这是空传播和空合并运算符的组合。

在下列情况下将产生ImportStatusEnum.Unknown

  • filenull—在这种情况下,不评估.ImportStatus??的左侧变为null,或
  • file不是null,但ImportStatusnull——在这种情况下,??的左侧也是null,所以使用的是右侧。

如果fileImportStatus都不是null的话,那么file.ImportStatus的值将作为整体表达式的结果。


@DasBlinkEnlight是正确的,只是为了以不同的方式显示它,它可以这样写(按照评估的顺序):

1
2
3
4
5
if (file == null) return ImportStatusEnum.Unknown;
if (file.ImportStatus  != null)
    return file.ImportStatus;
else
    return ImportStatusEnum.Unknown;


实际上,编译器将根据ImportStatus是否可以为空生成不同的代码。如果它不可以为空,那么如下所示:

1
public ImportStatusEnum ImportStatus {get; set;}

然后编译器将生成:

1
return file != null ? file.ImportStatus : ImportStatusEnum.Unknown;

这和

1
2
3
if (file != null)
    return file.ImportStatus;
return ImportStatusEnum.Unknown;

如果属性可以为空,则如下所示:

1
2
3
public ImportStatusEnum? ImportStatus {get; set;}
//OR
public Nullable<ImportStatusEnum> ImportStatus {get; set;}

然后它将按照@dasbinkenlight和@garethb在他们的答案中指出的方式进行。