摆脱“可为 null”的警告

Get rid of "Nullable" warnings

提问人:Sascha Heimann 提问时间:8/8/2022 最后编辑:Sir RufoSascha Heimann 更新时间:1/16/2023 访问量:1819

问:

我有以下代码:

var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonbytes);
var claims = keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString()));

如您所见,我的 ide 向我显示一个 Nullable 警告。

vscode warning

我知道我必须检查一个变量是否为空,然后才能使用它来摆脱这样的警告。但是我不知道如何在 linq 查询中使用动态变量..?

我希望有人能告诉我在这种情况下如何避免这样的警告。

C# 可视化工作室 代码

评论

0赞 Slipoch 8/8/2022
也许要么将错误消息粘贴为文本,要么直接将图像粘贴到此处(我知道您可能还没有权限这样做),永远不要发布外部图像链接,因为它可能始终是有毒链接。(将来可能会停止存在)
0赞 Sir Rufo 8/8/2022
@Slipoch 图像从来没有任何问题 - 它只是缺少前导“!”来内联显示它
0赞 Sascha Heimann 8/8/2022
呵呵,好吧。谢谢你的提示。我不被允许上传图片。
0赞 Slipoch 8/9/2022
啊,对了!awesomesauce,不确定您是否有权添加图像。

答:

-1赞 pazcal 8/8/2022 #1

IDE 会发出此警告,因为此变量在命中此行时可能会出现此警告。null

如果您完全确信这种情况永远不会发生,则可以使用 来逃避这些警告:!

keyValuePairs!.Select(kvp => new Claim(kvp.Key, kvp.Value!.ToString())!);

如果可能是其中 1 个属性,则可以转义这些属性:null

keyValuePairs?.Select(kvp => new Claim(kvp.Key, kvp.Value?.ToString()));

评论

0赞 Sascha Heimann 8/8/2022
谢谢你的回答。是的,这适用于 keyValuePairs 对象,但不适用于 kvp.value 对象。IDE 将始终显示该值的警告。
0赞 Sascha Heimann 8/8/2022
好的,我找到了原因。我必须设置 !在 ToString() 方法上也是如此。var 声明 = keyValuePairs!。选择(kvp => new Claim(kvp.Key!, kvp.价值!。ToString()!));
2赞 Hans Kesting 8/8/2022
请注意,这并不能阻止 NullReferenceException,当它实际上仍然具有值时。 (使用而不是 )在这种情况下只返回nullkvp.Value?.ToString()?!null
0赞 Sascha Heimann 8/8/2022 #2

正如 Pazcal 已经说过的那样,我可以使用 !在对象之后转义这样的警告。非常感谢您的提示。

无论如何,我现在已将我的函数更改为:

private IEnumerable<Claim> ParseClaimsFromJwt(string jwt)
{
    if (jwt!=null && !String.IsNullOrEmpty(jwt)) {
        var payload = jwt.Split('.')[1];
        var jsonbytes = ParseBase64WithoutPadding(payload);
        var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonbytes);
        if (keyValuePairs!=null && keyValuePairs.Count > 0) {
            var claims = keyValuePairs!.Select(kvp => new Claim(kvp.Key!, kvp.Value!.ToString()!));
            return claims;
        } else {
            throw new Exception("Error while deserializing jwt json string.");
        }
    } else {
        throw new Exception("jwt value cannot be empty or null");
    }            
}

我希望,这现在是安全的:-)

非常感谢您的帮助。

评论

0赞 Jeppe Stig Nielsen 8/8/2022
由于您决定显式编写第一个 null 检查,因此您的第一个检查可能只是一个 .如果你想花哨,你可以把组合支票写成.(此外,如果需要,您可以省略两个,因为无论如何控制都不会离开该部分。!..keyValuePairs !=null && keyValuePairs.Count > 0keyValuePairs?.Count > 0elseif
1赞 Enes Taha Selek 8/8/2022 #3

在 .csproj 文件中,你会发现如下

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

此字段将被禁用。我认为这是你的解决方案。但不安全。<Nullable>enable</Nullable>

0赞 sayditto 1/16/2023 #4
var claims = keyValuePairs?.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString() ?? string.Empty));

这个怎么样?

评论

1赞 Community 1/16/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 sayditto 1/16/2023
@Community机器人,我不明白你的意图是什么。你只是一个机器人吗?他问如何删除代码中的警告。所以我只是建议从我这边编辑的那个。我认为它确实需要任何额外的解释。就这样。