将C# 8可空引用类型标记为“此处不能为空”

3

我正在尝试使用 C# 8.0 中的新可空引用类型。但是我遇到了一个小问题:

foreach(FileSystemAccessRule rule in directorySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
    // do something with rule
}

这里显示了一个警告,因为编译器认为rule可能是null,但实际上它永远不会是。

我目前的解决方法是:

foreach(FileSystemAccessRule? rule in directorySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
    if (rule == null) continue;
    // do something with rule
}

但如果有一个类似于[NeverNull]FileSystemAccessRule rule这样的修复方法,我会更加高兴。是否有办法实现这一点?


你为什么认为它永远不会为空?你有检查过GetAccessRules方法的实际实现吗?你可以使用空值忽略运算符!来轻松修复它,例如rule! - Pavel Anikhouski
1
涉及到此案例的相关问题:#3045#3214 - canton7
根据参考文献(https://referencesource.microsoft.com/mscorlib/R/1ef6853d86f1534a.html),GetRules似乎总是返回一个集合,但内部永远不会有“null”条目。 - MuhKuh
@MuhKuh,你正在查看.NET FW源代码,如果要查看.NET Core源代码,应该访问https://source.dot.net/或官方GitHub存储库。C# 8仅在.NET Core 3.x中受支持。 - Pavel Anikhouski
1
@PavelAnikhouski 谢谢你。canton7 似乎有来自微软的开放问题,指导解决这个问题。 - MuhKuh
1个回答

7

如果AuthorizationRuleCollection没有声明可空性或将它们声明为可空类型:编译器报错是正确的。然而,如果您确定可以使用"dammit"运算符:

rule!.DoTheThing();

目前(撰写本文时)有一个未解决的问题,将来可能会稍微改变这个规则。


6
谢谢您使用正确的术语,而不是那些虚构的“null-forgiving operator”胡言乱语 ;) - Jon Skeet
1
它是正式的,被用于msdn,是一个完全有效的术语..我今天第一次听到。 - Sinatr
@MarcGravell,如果将来有什么变化,您能否将此链接添加到正在进行的讨论中以更新您的帖子:https://github.com/dotnet/csharplang/issues/3214。我会接受您的答案作为解决方案。 - MuhKuh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接