【发布时间】:2020-04-09 01:58:25
【问题描述】:
在下面,C# 确信“属性”永远不会为空,但我知道它可以是,因为外部库不是使用 C#8/可空类型生成的:
#nullable enable
SomeExternalClass obj = GetSomeExternalObjectFromAnOldAPI();
SomeExternalProperty property = obj.SomeProperty;
DoStuff(property); // C# is confident that property is not null, here
这是条件截图:
执行以下操作也不会提供空警告。 C# 仍然自信地假定外部 API 完全不可为空:
#nullable enable
SomeExternalClass obj = GetSomeExternalObjectFromAnOldAPI();
SomeExternalProperty? property = obj.SomeProperty;
DoStuff(property); // C# is still confident that property is not null, here
有没有一种方法可以强制 C# 承认一个变量可能为空,即使它应该确信它不会是空的?的相反!象征。 “相信我,这个垃圾可以是空的……”
已解决。接受的答案:
#nullable enable
SomeExternalClass obj = GetSomeExternalObjectFromAnOldAPI();
SomeExternalProperty? property = obj.SomeProperty ?? null;
DoStuff(property); // C# is now warning about possible null
【问题讨论】:
-
不,我想要一种语法机制来强制 C# 确认可能的 null,以便在使用该值时收到警告。说“记住做空检查,伙计们”违背了整个 C#8 事情的目的。尤其是当 VS 经常明确告诉我“嘿,伙计,这永远不会为空”时。虚假的信心等等。如果没有新功能会更好。
-
当问题出在外部库时,不要责怪 c#。一个库应该报告它可以抛出和返回类型的异常。这就是 c# 必须使用的全部内容。请注意,您在问题中说“外部库不是使用 C#8/可空类型生成的:”具体是说它不能为空。
-
理想的情况是,任何不是使用新的 C# 语法生成的外部库(我会经常在这里删除措辞,所以相信我们知道我在说什么)自动获得?在每个函数、方法、返回类型、属性等的末尾,以反映他们无法保证的事实。但我完全理解这在技术上可能是不可能的。我只是想要一种机制来撤销我现在拥有的外部库的“信任”C#。
标签: c# c#-8.0 nullable-reference-types