??操作员 - 在一个衬管条件下使用

时间:2017-06-06 01:08:19

标签: c#

有人可以解释以下声明的运作方式。我知道??如果第一个参数不为null,则返回第一个参数。但是当我看到它时,我有点困惑?跟随'file'变量。

return file?.ImportStatus ?? ImportStatusEnum.Unknown;

3 个答案:

答案 0 :(得分:9)

这是null propagation null coalesce 运算符的组合。

在以下情况下会产生ImportStatusEnum.Unknown

  • filenull - 在这种情况下,.ImportStatus未评估,??的左侧变为null },或
  • file不是nullImportStatusnull - 在这种情况下,??的左侧是还null,因此使用了右侧。

如果file及其ImportStatus都不是null,则file.ImportStatus的值将用作整体表达的结果。

答案 1 :(得分:5)

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

if (file == null) return ImportStatusEnum.Unknown;
if (file.ImportStatus  != null) 
    return file.ImportStatus;
else 
    return ImportStatusEnum.Unknown;

答案 2 :(得分:1)

实际上,编译器会根据ImportStatus是否可以为空来生成不同的代码。如果它不可为空,那么就像这样:

public ImportStatusEnum ImportStatus {get; set;}

然后编译器将生成:

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

相同
if (file != null)
    return file.ImportStatus;
return ImportStatusEnum.Unknown;

如果属性可以,那么就像这样:

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

然后它将执行@dasblinkenlight和@garethb在答案中指出的内容。