非常简单:
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
及原始数组类型的等级来重新组合数组类型。
那么,有人能解释为什么具有相同等级的两个数组类型不被视为相等吗?
我意识到可能有一些微妙之处我还没有理解,也可以使用一些解决方法,只是好奇发生了什么!
Activator.CreateInstance(type)
创建一个不同类型的实例非常奇怪。 - Jon Skeet