2012-03-20 21 views
5

可能重複:
IEnumerable.Cast<>使用Cast轉換int []爲double [] <T>?

人們可以從int翻一番隱式轉換。 爲什麼「指定的轉換無效」。這裏提出異常嗎?

double[] a = Enumerable.Range(0, 7).Cast<double>().ToArray(); 

我試過了它的幾個「版本」。

P.S.我知道可能的解決方案,如:

double[] a = Enumerable.Range(0, 7).Select(x => (double)x).ToArray(); 

但我很好奇鑄造工作=>爲什麼它不起作用在這個例子看起來如此明顯。

回答

4

Cast用於將IEnumerable(無類型)變成IEnumerable<T>(一般鍵入)。它實際上並不會對任何成員造成不同的影響。

this answer

好了,你有演員的不正確的期待,這一切 - 它的意思 處理裝箱/拆箱,參考和身份轉換, 這一切。這是不幸的文件是不是明確的,因爲 它可能是

所以,你堅持.Select()

+0

有鑑於此,「鑄造」int x = 42; double d =(double)x;'工作? – 2012-03-20 21:47:12

+3

難道我把這個問題作爲一個重複而不是提供你所鏈接問題的接受答案是更合適的嗎? – 2012-03-20 21:49:19

+0

+1 Btw:選擇比Cast更快,測試多次。 – 2012-03-20 21:52:49

3

失敗的原因是因爲基本上你這樣做:

 int x = 10; 
     object f = x; 
     double d = (double) f; 

int是越來越盒裝入對象,當你去拆箱它,你想它拆箱到雙。

更具體地說,這裏的演員的實現:

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) 
{ 
    IEnumerable<TResult> enumerable = source as IEnumerable<TResult>; 
    if (enumerable != null) 
    { 
     return enumerable; 
    } 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    return Enumerable.CastIterator<TResult>(source); 
} 

private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) 
{ 
    foreach (object current in source) 
    { 
     yield return (TResult)current; 
    } 
    yield break; 
} 

正如你可以看到,它的循環通過IEnumerable和拳擊源的每個元素。然後它會試圖解開你炸燬的那一點。