Очень просто:
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" дает a
Type
, чейName
is"Object[*]"
, тогда как опускание дает"Object[]"
.
Поэтому я подумал, что ранг object[]
не 1
(хотя это явно есть!) - поэтому я сделал это:
var type1 = typeof(object[]);
var type2 = type1.GetElementType().MakeArrayType(type1.GetArrayRank());
var equal = type1 == type2; //false
Теперь типы определенно имеют одинаковый ранг, но не равны.
Этот сценарий больше похож на мой текущий сценарий, когда я пытаюсь построить ковариацию Array в Rezolver - поэтому я перекомпоную типы массивов, перейдя по базовым иерархиям и используя
MakeArrayType
с исходным рангом типа массива.
Итак - может ли кто-нибудь объяснить, почему два типа массива с одинаковым рангом не считаются равными?
Я понимаю, что, возможно, какой-то нюанс здесь отсутствует, и что есть обходные пути, которые я могу использовать, мне просто интересно, что происходит!