问题标签 [nullability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
858 浏览

c# - Task.FromResult 的可空性警告

我们的代码库(.NET Standard 2.0 库)中有以下方法:

我们目前正在尝试转向 C# 8.0 Nullability 并在上面的代码中收到警告:

警告 CS8604:“Task Task.FromResult(T result)”中的参数“result”可能为空引用参数。

为什么我们会收到此警告?对我来说,它看起来非常好,null作为参数传递给Task.FromResult.

重要提示:我们希望允许 Task 包含空值。但是添加Task<T?>会迫使我们添加我们无法做到的类型约束。

0 投票
0 回答
37 浏览

java - 可以从 JSR-305 中的方法参数可空性推断方法返回值可空性吗?

假设我有一个解析数字的方法,并且应该从它的参数中推断出它的返回值可空性契约:

其中@...标记代表一些可空性转换。有了这个,我也有类似的东西:

  • final int n = tryParse("foo", 0)(在所有情况下都是安全的:n被认为永远不会有null所以拆箱不会导致NullPointerException
  • @Nullable final Integer n = tryParse("foo", null)(安全:双手都是空感知的)
  • final int n = tryParse(someVar, null)someVar(不安全:如果不是有效的 int 字符串表示,可能会导致 NPE )。

有没有办法根据传递给方法参数可空性的参数绑定返回值的可空性,或者我应该只创建一个具有明确隔离的装箱和原始默认值的重载(这对于这种情况可能很好,但原始类型不是我想处理的唯一情况)?

如果重要:我在构建中不使用静态分析工具,但我使用 IntelliJ IDEA ( javax.annotation, not org.jetbrains.annotations) 中的可空性检查并设置警告严重性。

0 投票
1 回答
1285 浏览

c# - 如何解决错误“NotNullWhen 属性由于其保护级别而无法访问”

我有以下扩展方法,我正在尝试用属性装饰out参数(T value) 。NotNullWhen但是,它显示错误“NotNullWhen 属性由于其保护级别而无法访问”,我不知道为什么?

我尝试将类访问修饰符更改为public无效。我还nullable为类库启用了 C# 8 上下文。

知道如何解决这个问题吗?

编辑:

我刚刚尝试使用上面的扩展类创建一个新的类库。现在它显示'找不到命名空间名称'NotNullWhen'的类型(您是否缺少 using 指令或程序集引用)'。我已经包括using System.Diagnostics.CodeAnalysis;了,但它是灰色的。项目文件包含以下内容:

0 投票
1 回答
245 浏览

c# - 为什么显式声明的引用返回值存在可空性警告?

我为我的测试项目启用了可空性上下文并尝试修复所有可空性警告。除了以下我不理解的(return ref book;在线)之外,我能够修复它们。我在编译器生成的这一行的注释中粘贴了警告:

ref Book book我不明白为什么编译器对方法中返回的可空变量不满意ref Book?

据我所知,我们可以将不可为空的变量分配给可空的变量,如下所示。正如下面的代码所示,如​​果我在具有类型的方法中返回非引用Book book变量,编译器不会发现任何问题:Book?

为什么编译器会在第一个代码片段中产生此错误:

Nullability of reference types in value of type 'Book' doesn't match target type 'Book?'.

0 投票
1 回答
64 浏览

c# - 如何实现接受ICollection的方法和 ICollection

给定以下方法:

这被称为:

第二个给出错误: 由于引用类型中的可空性差异,不能使用集合

类似的实现接受IEnumerable<T?>工作正常,因为IEnumerable是协变的。

我无法创建额外的方法接受ICollection<T>,因为可空性不是签名的一部分。有什么方法可以编译它,因为它可以在可空性之前工作?

删除class约束或将其更改class?为在调用时会出错,Collection<TestClass?>因为TestClass?与约束不匹配IDisposable

0 投票
3 回答
360 浏览

c# - 如何从标有 [return:MaybeNull] 的泛型中正确返回“null”?

在 Microsoft 的可空性文档中,似乎存在相互矛盾的信息。

此页面上,它显示以下内容(重要部分以粗体/斜体显示):

通用定义和可空性

正确传达泛型类型和泛型方法的空状态需要特别小心。额外的关注源于可空值类型和可空引用类型根本不同的事实。Anint?是 的同义词Nullable<int>,而string?isstring带有编译器添加的属性。结果是编译器在T?不知道T是 aclass还是 a的情况下无法生成正确的代码struct

这个事实并不意味着您不能使用可为空的类型(值类型或引用类型)作为封闭泛型类型的类型参数。List<string?> 和 List<int?> 都是 List 的有效实例。

它的意思是你不能使用T?在没有约束的泛型类或方法声明中。例如,Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>)将不会更改为 returnT?。您可以通过添加structorclass约束来克服此限制。有了这些约束中的任何一个,编译器就知道如何为 T 和 T? 生成代码。

好的,所以如果你想T?在泛型中使用,你必须将它限制为 astructclass. 很简单。

但是然后在下一页中,他们这样说(再次以粗体/斜体强调):

指定后置条件:MaybeNull 和 NotNull

假设您有一个具有以下签名的方法:

您可能已经编写了这样的方法,以便null在未找到所搜索的名称时返回。null清楚地表明没有找到该记录。在此示例中,您可能会将返回类型从 更改CustomerCustomer?。将返回值声明为可空引用类型清楚地指定了此 API 的意图。

由于通用定义和可空性中涵盖的原因,该技术不适用于通用方法。您可能有一个遵循类似模式的通用方法:

您不能指定返回值为T?[but the] 方法null在未找到所查找的项目时返回。由于您不能声明T?返回类型,因此您将MaybeNull注释添加到方法返回:

前面的代码通知调用者合约暗示了一个不可为空的类型,但返回值实际上可能是null. MaybeNull当您的 API 应该是不可为空的类型(通常是泛型类型参数)时使用该属性,但可能存在null会返回的实例。

然而...

即使直接从文档中复制该代码并为其提供一个简单地返回的默认实现null,它也不会编译!

我尝试了第一个链接页面中也提到的null-forgiving运算符null!(在“将属性初始化为空”部分下),但这不起作用。您不能使用default其中任何一个,因为它不会返回null值类型int,例如返回零,如下所示:

输出:

那么我在这里错过了什么?你如何成功地实现他们的示例代码而不诉诸使用T?which 需要将其类型约束为classor struct?如果你必须这样做,那有什么意义MaybeNull呢?

0 投票
1 回答
104 浏览

c# - 如果在 Directory.Build.props 中定义,Visual Studio 可空性引用错误将显示为警告

这可能只是一个临时的 VS 错误,但我想看看是否有人有任何修复,或者是否有我缺少的 VS 设置。

如果我定义可空性错误:

我在 a 内这样做.csproj,结果如预期的那样: 可空性错误显示

但是,如果属性是在Directory.Build.props文件中定义的,它适用于整体解决方案,它们不再显示为错误: 没有错误显示

它仍然会阻止编译,并且您仍然可以在原始文本输出中看到错误。但是红色的波浪线没有显示(只是绿色),更重要的是,错误列表窗格是空的。

有谁知道这是为什么,或者如何解决?我想通过 整体定义可空性错误Directory.Build.props,但它在当前状态下无法使用。

0 投票
4 回答
280 浏览

ios - 如何在objc中使非指针类型属性为空

嗨 iam 学习 IOS 开发和学习 porpoises
我想知道如何在 objc 中使这个属性可以为空(这四个 @property)

因为当我使用 nullable 我得到这个错误

什么是使所有 4 个属性都可以为空的正确方法我该怎么做(接受 Null)

这是我的应用程序的 M 文件

0 投票
3 回答
766 浏览

kotlin - Kotlin checkNotNull 与 requireNotNull

当我在 Kotlin 中学习新组件时,我遇到了requireNotNullcheckNotNull但我发现的唯一区别是requireNotNull可以抛出一个IllegalArgumentExceptionwhilecheckNotNull可以抛出一个IllegalStateException. 这是有两种方法的唯一原因,还是我缺少一些底层实现细节?

0 投票
2 回答
214 浏览

typescript - 如何将 TypeScript 的索引访问类型与可为空的嵌套类型一起使用?

我正在尝试根据另一种类型定义 TypeScript 类型。

这有效:

但是,当data属性可以为空时,这不起作用:

并导致错误:

如何在不重复任何部分的情况下根据 定义我的NestedData类型?ResultResult

TypeScript Playground 上的演示

编辑:我NestedData从代码生成工具中获取我的类型,并且我将其定义NestedData为更短的类型别名。实际上打字时间更长,所以我想尽量减少重复。