Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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#_Arrays_Nullable - Fatal编程技术网

C# 可空数组,为什么需要它们

C# 可空数组,为什么需要它们,c#,arrays,nullable,C#,Arrays,Nullable,我看到这样的代码,我理解它使数组可以为null,但我不明白为什么我们需要它,因为数组是ref类型,所以它们已经可以为null了 所以,我的问题是为什么我们需要这个 private readonly decimal?[] _amounts = new decimal?[_count]; 将其声明为十进制?[]意味着数组包含的元素可以为null或非null 如果不使其为null,数组可以存储的元素就不能为null 换句话说,十进制?[]读取为一个可为空的小数数组。这个是指数组可以包含的元素,而不是

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

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

private readonly decimal?[] _amounts = new decimal?[_count];
将其声明为十进制?[]意味着数组包含的元素可以为null或非null

如果不使其为null,数组可以存储的元素就不能为null


换句话说,十进制?[]读取为一个可为空的小数数组。这个是指数组可以包含的元素,而不是数组本身,因为所有数组都是引用类型。

此处的可空说明符不是指数组本身,而是指数组的内容。正如您正确地说的,数组本身是一种引用类型,因此,至少在C8之前始终是可nulable的

有几个不同的例子:

decimal[] nonNullable = new decimal[2];
nonNullable[0] = 1;             //OK, a non null item
nonNullable[1] = null;          //Compile error: array doesn't accepts nulls
nonNullable = null;             //OK, set the array reference to null

decimal?[] nullable = new decimal?[2];
nullable[0] = 1;                //OK, a non null item
nullable[1] = null;             //OK, a null item (actually, a Nullable<decimal> instance)
nullable = null;                //OK, set the array reference to null

数组对象本身和数组元素之间存在差异。当您使用decimal?[]时,您正在声明一个数组,其元素是可为空的十进制值。如果要使用十进制[]?我不确定这是否是有效的语法,但仅出于解释目的,假设您将声明一个可能引用数组或可能不引用任何内容的变量。后者是您描述的无用案例,因为正如您所说,至少在旧版本的C中,所有数组变量都是已经可以设置为null的引用变量

为了澄清差异,考虑Alejandro所发布的代码,以及该代码:

decimal[]? reallyNullable = null;

Array.Sort(reallyNullable); // ArgumentNullException -- there is no array here
Array.Sort(nullable); // OK, assuming null can be compared to decimal.

最后一行是OK的原因是这里实际引用了一个数组对象。唯一为null的是其中的一些值。

值得一提的是,在C 8.0中,可以有一个可为null的引用类型:

但正如其他人提到的:

private readonly decimal?[] _amounts = new decimal?[_count];
表示数组中的值类型元素可以为null。decimal是值类型,通常不能将其赋值为null,但如果您有decimal?那你就可以了

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

private decimal?[]? _amounts;
现在它意味着数组中的两个元素都可以为null,并且整个数组的变量可以为null


那么一般来说元素值类型后面的问号是什么?[]->SomeValueType之前?[]表示数组中的元素可以为null。从C 8.0开始,在项目问号中启用功能?在数组类型SomeArrayType[]->SomeArrayType[]之后?这意味着您可以为保存数组引用的变量赋值null。

这里的主要混淆似乎是它不是一个可为空的小数数组,而是一个可为空的小数的规则数组。谢谢,这就解释了。请注意,我的问题是将数组初始化为新的小数?[count],而不是新的小数[count]@cd491415是的,我注意到了。我把它们放在一起是为了比较,以显示它们在哪些情况下有不同的行为,包括你的具体情况和虚构的情况。很棒的解释。非常感谢巴特!