我正在研究一個有幾種不同類型的陣列的小型項目(例如double[]
,float[]
,int[]
)。爲了驗證/測試/理智的目的,我將這些陣列中的一些打印到控制檯上。所以我有一個看起來像下面的這些多種功能(簡化這個例子 - 假設我只用一維數組處理):爲什麼System.Array不能是類型約束?
void Print(float[] a) // prints an array of floats
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
void Print(double[] a) // prints an array of doubles
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
我,在我無窮的智慧,以爲可以減少一些通過簡單地創建這些函數的通用版本來重複代碼。所以我試過這個:
void Print<T>(T t) where T : Array
{
for (int i = 0; i < t.Length; i++)
{
Console.Write(t.GetValue(i));
}
}
智能感知是不是在抱怨,但是編譯器失敗,一個很有趣的錯誤:
Constraint cannot be special class 'System.Array'
我看過一個解釋(類似於Object
或密封類,但都沒有找到多少,除了一個提及on msdn。任何人都可以向我解釋爲什麼這種情況?爲什麼我無法指定類型約束System.Array
?
PS:雖然輸入了這一點,我意識到,我可以完成我本來想更容易,用一個簡單的功能是這樣的:
void Print(System.Array a)
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a.GetValue(i));
}
}
這是爲什麼有在編譯器陣列的特殊規則?
有意義,但我仍然好奇_why_我不能有一個基類類型約束的'數組'... – vlad 2013-02-10 05:35:41
另外,出於好奇,是不同於使用'Array'類型的參數?如果我使用'Array',有沒有一些拳擊? – vlad 2013-02-10 05:36:13
@vlad沒有裝箱,因爲數組是引用類型,而不是值類型,儘管你不像裝有類型數組那樣裝箱了它。這也不一樣,因爲'Array'也可能是2,3或N維數組,或者索引不是0的數組。 – Servy 2013-02-10 05:38:58