gpt4 book ai didi

c# - 具有相同元素类型和等级的数组类型不相等

转载 作者:可可西里 更新时间:2023-11-01 08:06:06 25 4
gpt4 key购买 nike

非常简单:

var equal1 = typeof(object[]) == typeof(object).MakeArrayType();
var equal2 = typeof(object[]) == typeof(object).MakeArrayType(1);
var equal3 = typeof(object[,]) == typeof(object).MakeArrayType(2);

假设所有三个都应该为真,但事实证明 equal2false - 这实际上没有意义,因为前两个 MakeArrayType 调用是等效的,生成的数组类型相同。

The only difference I can actually discern is that explicitly passing the rank of the array type as '1' yields a Type whose Name is "Object[*]" whereas omitting it yields "Object[]".

所以我想,object[] 的等级可能不是 1(尽管它显然是!)- 所以我这样做了:

var type1 = typeof(object[]);
var type2 = type1.GetElementType().MakeArrayType(type1.GetArrayRank());
var equal = type1 == type2; //false

现在类型肯定具有相同的等级,但不相等。

This scenario is more like my current scenario as I try to build Array covariance into Rezolver - so I'm recomposing array types by walking base hierarchies and using MakeArrayType with the original array type's rank.

那么 - 谁能解释为什么具有相同秩的两个数组类型不被视为相等?

我意识到我可能在这里遗漏了一些细微差别,并且有一些我可以使用的解决方法,我只是想知道发生了什么!

最佳答案

documentation解释区别:

The common language runtime makes a distinction between vectors (that is, one-dimensional arrays that are always zero-based) and multidimensional arrays. A vector, which always has only one dimension, is not the same as a multidimensional array that happens to have only one dimension. You cannot use this method overload to create a vector type; if rank is 1, this method overload returns a multidimensional array type that happens to have one dimension. Use the MakeArrayType() method overload to create vector types.

所以基本上,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[*] 并且转换将失败。

关于c# - 具有相同元素类型和等级的数组类型不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45693868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com