如何解决无法安全检测空值而没有可空警告 更新
我不太明白以下可为空警告。
如您所见,我有一部分表达式,其中 sheet
不为空,但 sheet.Id
可能为空。但为什么我不能用 sheet.Id.HasValue
来找出答案?
我也尝试过 sheet.Id != null
,但这给了我不同的警告。
警告 CS8625 无法将空文字转换为不可为空的引用类型。
如何安全地确定 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;
}
解决方法
可以合并
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;
我不知道为什么编译器不够聪明,无法意识到在表达式的某些方面,某些字段不能再为空。
顺便说一句,根据您想要在可空链接兔子洞中走多远,您可以重写图像中的代码,使其看起来像这样:
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,true) == 0 && s.Id?.HasValue == true)
.Select(s => ((WorksheetPart) workbookPart!.GetPartById(s.Id!)).Worksheet)
.FirstOrDefault();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。