【问题标题】:I want to warn the compiler about possible nulls from external code我想警告编译器可能来自外部代码的空值
【发布时间】: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


【解决方案1】:

试试:

ElementId? viewTemplateId = (revitView.ViewTemplateId ?? someNullTypeOfYourChoosing);

或者,允许 ViewrevitView.ViewTemplateId 结构为可空/返回可空类型。

【讨论】:

  • SomeExternalProperty? property = obj.SomeProperty ?? null; 成功强制 C# 识别可能的 null。干杯。
  • 有趣。那么,如果使用#nullable enable 重新编译引用的库并且现在保证没有空值,那么在这种情况下会发生什么?行为是否会发生变化,或者这种方法对于这种特定情况是否“过拟合”?
  • 不确定!值得一试。我的猜测是,在错误或警告方面什么都不会改变——调用代码只会添加不必要的空检查,这些检查永远不会在运行时执行。我知道一个事实,但是我引用的这个特定 API 不会很快采用#nullable enable!他们喜欢在完全出乎意料的地方在整个商店中退回 null。
【解决方案2】:

您可以编写一个方法'void MaybeNull([System.Diagnostics.CodeAnalysis.MaybeNull] T t)'并使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多