Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我想警告编译器外部代码可能会出现空值_C#_C# 8.0_Nullable Reference Types - Fatal编程技术网

C# 我想警告编译器外部代码可能会出现空值

C# 我想警告编译器外部代码可能会出现空值,c#,c#-8.0,nullable-reference-types,C#,C# 8.0,Nullable Reference Types,在下面的例子中,C#确信“property”永远不会为null,但我知道它可以为null,因为外部库不是用C#8/nullable类型生成的: #nullable enable SomeExternalClass obj = GetSomeExternalObjectFromAnOldAPI(); SomeExternalProperty property = obj.SomeProperty; DoStuff(property); // C# is confident that propert

在下面的例子中,C#确信“property”永远不会为null,但我知道它可以为null,因为外部库不是用C#8/nullable类型生成的:

#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
尝试:

ElementId?viewTemplateId=(revitView.viewTemplateId??您选择的某个空类型)


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

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

这回答了你的问题吗?不,我想要一种语法机制来强制C#确认一个可能的空值,以便在使用该值时得到警告。说“记住做空检查,伙计们”违背了整个C#8的目的。特别是当VS明确告诉我“嘿,伙计,这永远不会是空的”时,它经常是空的。虚假的自信等等。如果没有新功能,情况会更好。当问题出在外部库时,不要责怪c#。库应该报告它可以抛出和返回的异常类型。这就是c#必须处理的所有问题。请注意,您在问题“外部库不是用C#8/nullable类型生成的:”具体来说就是说它不能为null。理想的情况是,任何没有用新的C#语法生成的外部库(我会经常在这里删掉短语,相信我们知道我在说什么)都会自动实现?在每一个函数、方法、返回类型、属性等等的末尾,都会显示出它们没有任何保证。但我完全理解这在技术上是不可能的。我只是想要一种机制来撤销C#应用于外部库的“信任”,我现在已经拥有了。
SomeExternalProperty?property=obj.SomeProperty??无效成功强制C#识别可能的空值。干杯,很有趣。那么,如果引用的库使用
#nullable enable
重新编译,并且现在保证没有空值,那么在这种情况下会发生什么呢?行为是否发生了变化,或者这种方法是否“过度适合”此特定情况?不确定!值得一试。我的猜测是,在错误或警告方面不会有任何变化——调用代码只会添加不必要的空检查,这些检查在运行时永远不会执行。不过,我知道我所引用的这个特定API不会很快采用
#nullable enable
!他们喜欢在商店里完全出乎意料的地方退货。