首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在没有空警告的情况下安全检测空值

无法在没有空警告的情况下安全检测空值
EN

Stack Overflow用户
提问于 2021-07-22 17:06:12
回答 1查看 148关注 0票数 0

我不太明白下面这个可空警告。

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

我也尝试过sheet.Id != null,但这给了我一个不同的警告。

警告CS8625不能将null文字转换为非空引用类型.

如何安全地确定sheet.Id是否为空?

更新

这个版本实际上是在没有警告的情况下编译的。但我还是不明白为什么其他版本会给我警告。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-22 17:42:23

你可以结合

代码语言:javascript
复制
        if (sheet != null && sheet.Id?.Value != null)
            return ((WorksheetPart)workbookPart!.GetPartById(sheet.Id!)).Worksheet;

变成一个等价的表达式:

代码语言:javascript
复制
         if (sheet?.Id?.HasValue == true)
            return ((WorksheetPart)workbookPart!.GetPartById(sheet.Id!)).Worksheet;

代码语言:javascript
复制
         if (sheet?.Id?.Value != null)
            return ((WorksheetPart)workbookPart!.GetPartById(sheet.Id!)).Worksheet;

我不知道为什么编译器不够聪明,不能意识到在表达式的某些术语中,某些字段不能再为null。

顺便说一句,根据您想要进入的可空链接兔子洞的距离,您可以从图像中重写代码,使其看起来如下所示:

代码语言:javascript
复制
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;
}

代码语言:javascript
复制
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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68488944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档