很简单:
var equal1 = typeof(object[]) == typeof(object).MakeArrayType();
var equal2 = typeof(object[]) == typeof(object).MakeArrayType(1);
var equal3 = typeof(object[,]) == typeof(object).MakeArrayType(2);
假设所有三个都应该是真的,但事实证明equal2
是false
- 鉴于前两个MakeArrayType
调用是等价的,这实际上没有意义结果数组类型相同。
我能真正辨别的唯一区别是明确地将数组类型的等级传递为“1”会产生
Type
Name
为"Object[*]"
,而省略它会产生{{1} }}
所以我想,也许"Object[]"
的等级不是object[]
(即使它显然是!) - 所以我这样做了:
1
现在类型肯定具有相同的等级,但不相等。
这个场景更像我当前的场景,因为我尝试将阵列协方差构建到Rezolver中 - 所以我正在通过遍历基本层次结构并使用
var type1 = typeof(object[]); var type2 = type1.GetElementType().MakeArrayType(type1.GetArrayRank()); var equal = type1 == type2; //false
和原始数组类型的等级来重构数组类型。
那么 - 任何人都可以解释为什么两个具有相同等级的数组类型被认为不相等?
我意识到这里可能存在一些细微差别,而且我可以使用的解决方法,我只是好奇发生了什么!
答案 0 :(得分:20)
documentation解释了差异:
公共语言运行库区分向量(即,始终从零开始的一维数组)和多维数组。始终只有一个维度的向量与恰好只有一个维度的多维数组不同。您不能使用此方法重载来创建矢量类型;如果rank为1,则此方法重载将返回恰好具有一个维度的多维数组类型。使用MakeArrayType()方法重载来创建矢量类型。
基本上,equal1
返回一个向量,equal2
返回一个排名为1的多维数组。
这两种类型在CLR中的处理方式截然不同。
有趣的是,如果您创建该类型的实例,您最终会再次使用向量:
var type = typeof(object).MakeArrayType(1);
// Create an instance with length 2
var array = Activator.CreateInstance(type, 2);
Console.WriteLine(array.GetType()); // System.Object[]
Console.WriteLine(type); // System.Object[*]
Array.CreateInstance
显示相同的行为:如果你要求一个下限为0且排名为1的数组,它将始终创建一个向量:
var array = Array.CreateInstance(typeof(object), new[] { 2 }, new[] { 0 });
Console.WriteLine(array.GetType());
object[] objArray = (object[]) array; // This is fine
如果将0更改为任何非零值,它将创建System.Object[*]
并且演员表将失败。