有人可以解释以下声明的运作方式。我知道??如果第一个参数不为null,则返回第一个参数。但是当我看到它时,我有点困惑?跟随'file'变量。
return file?.ImportStatus ?? ImportStatusEnum.Unknown;
答案 0 :(得分:9)
这是null propagation和 null coalesce 运算符的组合。
在以下情况下会产生ImportStatusEnum.Unknown
:
file
为null
- 在这种情况下,.ImportStatus
未评估,??
的左侧变为null
},或file
不是null
,ImportStatus
是null
- 在这种情况下,??
的左侧是还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在答案中指出的内容。