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