问题标签 [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.
c# - Task.FromResult 的可空性警告
我们的代码库(.NET Standard 2.0 库)中有以下方法:
我们目前正在尝试转向 C# 8.0 Nullability 并在上面的代码中收到警告:
警告 CS8604:“Task Task.FromResult(T result)”中的参数“result”可能为空引用参数。
为什么我们会收到此警告?对我来说,它看起来非常好,null
作为参数传递给Task.FromResult
.
重要提示:我们希望允许 Task 包含空值。但是添加Task<T?>
会迫使我们添加我们无法做到的类型约束。
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
) 中的可空性检查并设置警告严重性。
c# - 如何解决错误“NotNullWhen 属性由于其保护级别而无法访问”
我有以下扩展方法,我正在尝试用属性装饰out
参数(T value
) 。NotNullWhen
但是,它显示错误“NotNullWhen 属性由于其保护级别而无法访问”,我不知道为什么?
我尝试将类访问修饰符更改为public
无效。我还nullable
为类库启用了 C# 8 上下文。
知道如何解决这个问题吗?
编辑:
我刚刚尝试使用上面的扩展类创建一个新的类库。现在它显示'找不到命名空间名称'NotNullWhen'的类型(您是否缺少 using 指令或程序集引用)'。我已经包括using System.Diagnostics.CodeAnalysis;
了,但它是灰色的。项目文件包含以下内容:
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?'.
c# - 如何实现接受ICollection的方法和 ICollection
给定以下方法:
这被称为:
第二个给出错误: 由于引用类型中的可空性差异,不能使用集合。
类似的实现接受IEnumerable<T?>
工作正常,因为IEnumerable
是协变的。
我无法创建额外的方法接受ICollection<T>
,因为可空性不是签名的一部分。有什么方法可以编译它,因为它可以在可空性之前工作?
删除class
约束或将其更改class?
为在调用时会出错,Collection<TestClass?>
因为TestClass?
与约束不匹配IDisposable
。
c# - 如何从标有 [return:MaybeNull] 的泛型中正确返回“null”?
在 Microsoft 的可空性文档中,似乎存在相互矛盾的信息。
在此页面上,它显示以下内容(重要部分以粗体/斜体显示):
通用定义和可空性
正确传达泛型类型和泛型方法的空状态需要特别小心。额外的关注源于可空值类型和可空引用类型根本不同的事实。An
int?
是 的同义词Nullable<int>
,而string?
isstring
带有编译器添加的属性。结果是编译器在T?
不知道T
是 aclass
还是 a的情况下无法生成正确的代码struct
。这个事实并不意味着您不能使用可为空的类型(值类型或引用类型)作为封闭泛型类型的类型参数。List<string?> 和 List<int?> 都是 List 的有效实例。
它的意思是你不能使用T?在没有约束的泛型类或方法声明中。例如,
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>)
将不会更改为 returnT?
。您可以通过添加struct
orclass
约束来克服此限制。有了这些约束中的任何一个,编译器就知道如何为 T 和 T? 生成代码。
好的,所以如果你想T?
在泛型中使用,你必须将它限制为 astruct
或class
. 很简单。
但是然后在下一页中,他们这样说(再次以粗体/斜体强调):
指定后置条件:MaybeNull 和 NotNull
假设您有一个具有以下签名的方法:
您可能已经编写了这样的方法,以便
null
在未找到所搜索的名称时返回。null
清楚地表明没有找到该记录。在此示例中,您可能会将返回类型从 更改Customer
为Customer?
。将返回值声明为可空引用类型清楚地指定了此 API 的意图。由于通用定义和可空性中涵盖的原因,该技术不适用于通用方法。您可能有一个遵循类似模式的通用方法:
您不能指定返回值为
T?
[but the] 方法null
在未找到所查找的项目时返回。由于您不能声明T?
返回类型,因此您将MaybeNull
注释添加到方法返回:前面的代码通知调用者合约暗示了一个不可为空的类型,但返回值实际上可能是
null
.MaybeNull
当您的 API 应该是不可为空的类型(通常是泛型类型参数)时使用该属性,但可能存在null
会返回的实例。
然而...
即使直接从文档中复制该代码并为其提供一个简单地返回的默认实现null
,它也不会编译!
我尝试了第一个链接页面中也提到的null-forgiving
运算符null!
(在“将属性初始化为空”部分下),但这不起作用。您不能使用default
其中任何一个,因为它不会返回null
值类型int
,例如返回零,如下所示:
输出:
那么我在这里错过了什么?你如何成功地实现他们的示例代码而不诉诸使用T?
which 需要将其类型约束为class
or struct
?如果你必须这样做,那有什么意义MaybeNull
呢?
ios - 如何在objc中使非指针类型属性为空
嗨 iam 学习 IOS 开发和学习 porpoises
我想知道如何在 objc 中使这个属性可以为空(这四个 @property)
因为当我使用 nullable 我得到这个错误
什么是使所有 4 个属性都可以为空的正确方法我该怎么做(接受 Null)
这是我的应用程序的 M 文件
kotlin - Kotlin checkNotNull 与 requireNotNull
当我在 Kotlin 中学习新组件时,我遇到了requireNotNull
,checkNotNull
但我发现的唯一区别是requireNotNull
可以抛出一个IllegalArgumentException
whilecheckNotNull
可以抛出一个IllegalStateException
. 这是有两种方法的唯一原因,还是我缺少一些底层实现细节?
typescript - 如何将 TypeScript 的索引访问类型与可为空的嵌套类型一起使用?
我正在尝试根据另一种类型定义 TypeScript 类型。
这有效:
但是,当data
属性可以为空时,这不起作用:
并导致错误:
如何在不重复任何部分的情况下根据 定义我的NestedData
类型?Result
Result
编辑:我NestedData
从代码生成工具中获取我的类型,并且我将其定义NestedData
为更短的类型别名。实际上打字时间更长,所以我想尽量减少重复。