C# ?? 操作员-在一个线性条件下使用

C# ?? 操作员-在一个线性条件下使用,c#,C#,有人能解释一下下面的陈述是如何运作的吗。我知道这个??运算符返回第一个参数(如果它不为null)。但是当我看到这张照片时,我有点困惑?在“file”变量后面 return file?.ImportStatus ?? ImportStatusEnum.Unknown; 这是和空合并运算符的组合 在以下情况下,它将生成ImportStatusEnum.Unknown: 文件为空-在本例中,不计算.ImportStatus,并且??变为空,或 文件不是空的,但ImportStatus是空的-在本例中

有人能解释一下下面的陈述是如何运作的吗。我知道这个??运算符返回第一个参数(如果它不为null)。但是当我看到这张照片时,我有点困惑?在“file”变量后面

return file?.ImportStatus ?? ImportStatusEnum.Unknown;
这是和空合并运算符的组合

在以下情况下,它将生成ImportStatusEnum.Unknown:

文件为空-在本例中,不计算.ImportStatus,并且??变为空,或 文件不是空的,但ImportStatus是空的-在本例中,是??也为null,因此使用右侧。 如果文件及其ImportStatus均不为null,则file.ImportStatus的值将用作整个表达式的结果。

这是和null合并运算符的组合

在以下情况下,它将生成ImportStatusEnum.Unknown:

文件为空-在本例中,不计算.ImportStatus,并且??变为空,或 文件不是空的,但ImportStatus是空的-在本例中,是??也为null,因此使用右侧。
如果文件及其ImportStatus均不为空,则file.ImportStatus的值将用作整个表达式的结果。

@dasblinkenlight是正确的,只是为了以另一种方式显示它,可以按求值顺序这样编写:

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

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

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

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

public ImportStatusEnum ImportStatus {get; set;}
public ImportStatusEnum? ImportStatus {get; set;}
//OR
public Nullable<ImportStatusEnum> ImportStatus {get; set;}
然后编译器将生成:

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

if (file != null)
    return file.ImportStatus;
return ImportStatusEnum.Unknown;
如果属性可为null,则如下所示:

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

然后它将执行@dasblinkenlight和@garethb在回答中指出的操作。

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

public ImportStatusEnum ImportStatus {get; set;}
public ImportStatusEnum? ImportStatus {get; set;}
//OR
public Nullable<ImportStatusEnum> ImportStatus {get; set;}
然后编译器将生成:

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

if (file != null)
    return file.ImportStatus;
return ImportStatusEnum.Unknown;
如果属性可为null,则如下所示:

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

然后它将执行@dasblinkenlight和@garethb在其答案中指出的操作。

这不是重复,因为重复答案中没有提到null传播运算符。这不是重复,因为重复答案中没有提到null传播运算符。好的,我的错,评估仍在继续,如下所示??显然。好吧,我错了,评估仍在继续,如下??显然地