提问人:Sascha Heimann 提问时间:8/8/2022 最后编辑:Sir RufoSascha Heimann 更新时间:1/16/2023 访问量:1819
摆脱“可为 null”的警告
Get rid of "Nullable" warnings
问:
我有以下代码:
var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonbytes);
var claims = keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString()));
如您所见,我的 ide 向我显示一个 Nullable 警告。
我知道我必须检查一个变量是否为空,然后才能使用它来摆脱这样的警告。但是我不知道如何在 linq 查询中使用动态变量..?
我希望有人能告诉我在这种情况下如何避免这样的警告。
答:
-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,当它实际上仍然具有值时。 (使用而不是 )在这种情况下只返回null
kvp.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 > 0
keyValuePairs?.Count > 0
else
if
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));
这个怎么样?
评论