C# 数组类型之间的隐式引用转换
在C#中,编写的标准是根据以下规则在数组之间存在隐式转换: 从元素类型为SE的数组类型S到元素类型为SE的数组类型T 元素类型TE,前提是满足以下所有条件:C# 数组类型之间的隐式引用转换,c#,C#,在C#中,编写的标准是根据以下规则在数组之间存在隐式转换: 从元素类型为SE的数组类型S到元素类型为SE的数组类型T 元素类型TE,前提是满足以下所有条件: S和T仅在元素类型上不同。换句话说,S和T拥有 相同数量的尺寸。 但如果我做了: int[] j = { 1, 2 }; int[] k = { 1 }; k = j; 未发出编译器错误。也许我不明白这条规则的含义 SE和TE都是参考类型。 但是,在上面的示例中,j和k的元素类型也是值类型 存在从SE到TE的隐式引用转换。
- S和T仅在元素类型上不同。换句话说,S和T拥有 相同数量的尺寸。
int[] j = { 1, 2 };
int[] k = { 1 };
k = j;
未发出编译器错误。也许我不明白这条规则的含义
- SE和TE都是参考类型。
j
和k
的元素类型也是值类型
- 存在从SE到TE的隐式引用转换。
int[] j = { 1, 2 };
short[] k = { 1, 5 };
j = k;
似乎可以从short
类型的元素隐式转换为int
类型的元素,但编译器没有编译。发出错误
我真的不明白这条规则是怎么起作用的
int[,]
(3维)int[,]
(3维)j
和k
都是同一类型。它们都是整数数组,并且都是一维的。因此,数组完全符合规则
以下是文档中所述阵列的不正确使用:
object[] j; int[] k;
int[,] j; int[] k;
float[] j; int[] k;
j
和k
都是同一类型。它们都是整数数组,并且都是一维的。因此,数组完全符合规则
以下是文档中所述阵列的不正确使用:
object[] j; int[] k;
int[,] j; int[] k;
float[] j; int[] k;
S和T指的是阵列的类型。在这种情况下,
j
和k
都是类型int[]
,因此没有隐式转换,因为它们是相同的类型
因为它们在元素类型上没有区别,所以它们的尺寸是不相关的。S和t指的是数组的类型。在这种情况下,
j
和k
都是类型int[]
,因此没有隐式转换,因为它们是相同的类型
因为它们在元素类型上没有差异,所以它们的维度是不相关的。这个代码的作用是使
k
和j
指向同一个数组,{1,2}
由于
k
和j
都是具有相同维数和相同元素类型的数组,因此可以使用此代码将一个点指向另一个点,此代码的作用是使k
和j
都指向相同的数组,{1,2}
由于
k
和j
都是具有相同维数和相同元素类型的数组,因此可以使用此代码将一个点指向另一个点在这种情况下不需要转换,因为i
和j
都是相同类型,int[]
。维度和元素类型都相同。您引用的规则在此不适用。相反,您应该了解以下内容:6.1.1标识转换标识转换将任何类型转换为相同类型。此转换的存在使得已经具有所需类型的实体可以说是可转换为该类型的。@PetSerAl,但是如果我不能使k=j,如果j是短[]j,k是int[]k,则所有数组转换都是类型标识转换的隐式转换@xdevel2000从string[]
到object[]
的隐式转换不是标识转换。@xdevel2000、int
和short
都是引用类型。它们之间不存在隐式引用转换<6.1.2隐式数字转换所涵盖的代码>short到int
转换。在这种情况下不需要转换,因为i
和j
是同一类型,int[]
。维度和元素类型都相同。您引用的规则在此不适用。相反,您应该了解以下内容:6.1.1标识转换标识转换将任何类型转换为相同类型。此转换的存在使得已经具有所需类型的实体可以说是可转换为该类型的。@PetSerAl,但是如果我不能使k=j,如果j是短[]j,k是int[]k,则所有数组转换都是类型标识转换的隐式转换@xdevel2000从string[]
到object[]
的隐式转换不是标识转换。@xdevel2000、int
和short
都是引用类型。它们之间不存在隐式引用转换<代码>短到int
转换包含在6.1.2隐式数字转换中。