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