将 null 文本或可能的 null 值转换为不可为 null 的类型,即使已检查 null [duplicate]

Converting null literal or possible null value to non-nullable type even if already checked for null [duplicate]

提问人:Sascha Heimann 提问时间:8/25/2023 最后编辑:Sascha Heimann 更新时间:8/25/2023 访问量:44

问:

谁能说出为什么编译器会抛出警告,即使我检查了 everthing 的 null??

// check if non default accent color is selected
var accCol = await LocalSorage.GetItemAsync<string>("accentColor");
if (!String.IsNullOrEmpty(accCol) && aColors!=null && aColors.accentColorsList!=null && aColors.accentColorsList.Count()>0)
{
    AccentColors res = aColors.accentColorsList.Find(x => x.ColorValue == accCol);
    if(res!=null) {
        this.selOption = res;
    }
    this.mAccentBaseColor = accCol;
}

VsCode 在 linq 查询上引发以下警告:将 null 文本或可能的 null 值转换为不可为 null 的类型。罗斯林 CS8600

由于不允许我发布警告的屏幕截图,因此会针对此行抛出警告:

AccentColors res = aColors.accentColorsList.Find(x => x.ColorValue == accCol);
C# .NET NullReferenceException

评论

1赞 Julian 8/25/2023
请不要上传代码/数据/错误的图像。
0赞 Sascha Heimann 8/25/2023
1.我已经删除了屏幕截图。我希望每个人都能理解这个问题。
0赞 Sascha Heimann 8/25/2023
@shingo确定我知道如何在 csproj 中禁用可为 null 的警告。但这不是我的问题。我想知道为什么编译器会抛出警告,即使我已经检查了 null。

答:

0赞 Sascha Heimann 8/25/2023 #1

好的,我自己找到了解决方案。我必须将 Linq 结果声明为可为 null。

// check if non default accent color is selected
var accCol = await LocalSorage.GetItemAsync<string>("accentColor");
if (!String.IsNullOrEmpty(accCol) && aColors!=null && aColors.accentColorsList!=null && aColors.accentColorsList.Count()>0)
{
    AccentColors? res = aColors.accentColorsList.Find(x => x.ColorValue == accCol);
    if(res!=null) {
       this.selOption = res;
    }
    this.mAccentBaseColor = accCol;
}