我不太明白下面这个可空警告。
如您所见,我有一个表达式的一部分,其中sheet不是空的,但sheet.Id可能是空的。但是为什么我不能用sheet.Id.HasValue来找出答案呢?


我也尝试过sheet.Id != null,但这给了我一个不同的警告。
警告CS8625不能将null文字转换为非空引用类型.
如何安全地确定sheet.Id是否为空?
更新
这个版本实际上是在没有警告的情况下编译的。但我还是不明白为什么其他版本会给我警告。
public Worksheet? GetFirstWorksheet()
{
WorkbookPart? workbookPart = Document.WorkbookPart;
Workbook? workbook = workbookPart?.Workbook;
if (workbook != null)
{
Sheets? sheets = workbook.GetFirstChild<Sheets>();
Sheet? sheet = sheets?.Elements<Sheet>()
.FirstOrDefault();
if (sheet != null && sheet.Id?.Value != null)
return ((WorksheetPart)workbookPart!.GetPartById(sheet.Id!)).Worksheet;
}
return null;
}发布于 2021-07-22 17:42:23
你可以结合
if (sheet != null && sheet.Id?.Value != null)
return ((WorksheetPart)workbookPart!.GetPartById(sheet.Id!)).Worksheet;变成一个等价的表达式:
if (sheet?.Id?.HasValue == true)
return ((WorksheetPart)workbookPart!.GetPartById(sheet.Id!)).Worksheet;或
if (sheet?.Id?.Value != null)
return ((WorksheetPart)workbookPart!.GetPartById(sheet.Id!)).Worksheet;我不知道为什么编译器不够聪明,不能意识到在表达式的某些术语中,某些字段不能再为null。
顺便说一句,根据您想要进入的可空链接兔子洞的距离,您可以从图像中重写代码,使其看起来如下所示:
Worksheet? GetWorksheet(string name)
{
WorkbookPart? workbookPart = Document.WorkbookPart;
Worksheet? sheet = workbookPart?.Workbook
.GetFirstChild<Sheets>()?.Elements<Sheet>()
.Where(s => string.Compare(s.Name, name, true) == 0 && s.Id?.HasValue == true)
.Select(s => ((WorksheetPart) workbookPart!.GetPartById(s.Id!)).Worksheet)
.FirstOrDefault();
return sheet;
}或
Worksheet? GetWorksheet(string name)
{
WorkbookPart? workbookPart = Document.WorkbookPart;
return workbookPart?.Workbook
.GetFirstChild<Sheets>()?.Elements<Sheet>()
.Where(s => string.Compare(s.Name, name, true) == 0 && s.Id?.HasValue == true)
.Select(s => ((WorksheetPart) workbookPart!.GetPartById(s.Id!)).Worksheet)
.FirstOrDefault();
}https://stackoverflow.com/questions/68488944
复制相似问题