可空数组和我们为什么需要它们

cd4*_*415 0 c# arrays nullable

我看到这样的代码,我理解为使数组可以为空但我不明白为什么我们需要它,因为数组是ref类型,所以它们已经可以为空了.

所以,我的问题是为什么我们需要这个呢?

private readonly decimal?[] _amounts = new decimal?[_count];
Run Code Online (Sandbox Code Playgroud)

Ous*_* D. 5

将其声明为decimal?[]表示数组包含的元素可以null是非空的.

在不使其可为空的情况下,数组可以存储的元素 不可能null.

换句话说,decimal?[]读作" 可空小数数组".的?,因为所有的阵列是引用类型指的是该阵列可以含有的元素,而不是数组本身.


BAR*_*ART 5

值得一提的是,从 C# 8.0 开始,您可以拥有一个空的引用类型https : //docs.microsoft.com/en-us/dotnet/csharp/tutorials/nullable-reference-types

但正如其他人提到的那样:

private readonly decimal?[] _amounts = new decimal?[_count];
Run Code Online (Sandbox Code Playgroud)

表示数组中的值类型元素可以为空。decimal是值类型,通常你不能为它赋值 null,但如果你有,decimal?那么你可以。

在启用 C# 8.0 和可为空引用类型功能的情况下,如果要将引用类型分配给它们,则应将引用类型声明为可为空引用类型,否则默认情况下您将收到编译器警告。您可以像这样声明一个:

private decimal?[]? _amounts;
Run Code Online (Sandbox Code Playgroud)

现在这意味着数组中的两个元素都可以为空,整个数组(_amounts 变量)可以为空。

所以一般来说,元素值类型之后?和之前的问号[] -> SomeValueType?[]意味着数组中的元素可以为空。从 C# 8.0(在项目中启用功能)?数组类型后的问号SomeArrayType[] -> SomeArrayType[]?意味着您可以将 null 分配给保存对数组的引用的变量。