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[*]"
而省略它产生"Object[]"
。
所以我想,也许object[]
秩不1
(即使它显然是!) - 所以我这样做:现在
var type1 = typeof(object[]);
var type2 = type1.GetElementType().MakeArrayType(type1.GetArrayRank());
var equal = type1 == type2; //false
类型肯定有相同的排名,但不平等。
这种情况更像是我目前的情况下,我尝试建立阵列协方差为Rezolver - 所以我步行的基础层次结构和使用
MakeArrayType
与原数组类型的排名重新构图数组类型。
所以 - 任何人都可以解释为什么两个相同排名的数组类型不被认为是相等的吗?
我意识到这里可能存在一些细微差别,并且有可以使用的解决方法,我只是好奇到底发生了什么事情!
我想象一个以矢量结尾的是编译器部分的优化,因为'2'在这种情况下将代表数组的大小[又名矢量]。 – JuanR
@Juan:实例创建与编译器无关 - 它是运行时/框架。 Activator.CreateInstance(type)'创建一个* * *类型的实例是很奇怪的。 –
谢谢@JonSkeet。我错过了。我的意思是说运行时可能会优化操作。激活器也有可能具有内部逻辑,这决定了你正在请求相当于一个向量。当我有机会时,我会尽力找到消息来源,并看一看。重点是,正在确定结果等同于一个向量。 – JuanR