2009-12-08 143 views
6

可能重複:
Enumerable.Cast<T> extension method fails to cast from int to long, why ?
Puzzling Enumerable.Cast InvalidCastException
Cast/Convert IEnumerable<T> to IEnumerable<U> ?爲什麼不會投入<double>()在IEnumerable <int>上工作?

我試圖整數數組轉換成double數組(這樣我就可以把它傳遞給需要的功能雙打數組)。

最明顯的解決方案(對我來說,至少)是對IEnumerable使用Cast擴展函數,但它給了我一個InvalidCastException,我不明白爲什麼。我的解決方法是使用Select,但我認爲Cast看起來更整潔。

有人能告訴我爲什麼Cast方法不起作用嗎?

希望下面的代碼說明了我的問題:

namespace ConsoleApplication1 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 

    class Program 
    { 
     static void Main() 
     { 
      var intArray = new[] { 1, 2, 3, 4 }; 
      PrintEnumerable(intArray, "intArray: "); 

      var doubleArrayWorks = intArray.Select(x => (double)x).ToArray(); 
      PrintEnumerable(doubleArrayWorks, "doubleArrayWorks: "); 

      // Why does this fail?? 
      var doubleArrayDoesntWork = intArray.Cast<double>().ToArray(); 
      PrintEnumerable(doubleArrayDoesntWork, "doubleArrayDoesntWork: "); 

      // Pause 
      Console.ReadLine(); 
     } 

     private static void PrintEnumerable<T>(
      IEnumerable<T> toBePrinted, string msgPrefix) 
     { 
      Console.WriteLine(
       msgPrefix + string.Join(
        ",", toBePrinted.Select(x => x.ToString()).ToArray())); 
     } 
    } 

}

+0

Ooops ...在詢問之前,我沒有仔細檢查堆棧溢出情況。我發現我的問題已被問及並回答:http://stackoverflow.com/questions/1684448/enumerable-castt-extension-method-fails-to-cast-from-int-to-long-why – dominic 2009-12-08 06:46:09

回答

2

嘗試使用Array類的Convertall方法。它給你明確的轉換控制權。

var doubleArray = Array.ConvertAll<int, double>(intArray, num => (double)num); 

這會繞過您所遇到的內部錯誤。

其他方法也可以明確控制轉換過程。

+1

這是一樣的如使用select。 – Dykam 2009-12-08 11:00:17

9

這個問題來自於在編譯時解決了cast操作符(重載)的問題。 嘗試思考Cast是如何實現的。我敢打賭,代碼如下所示:

public static IEnumerable<T> Cast<T>(this IEnumerable source) 
{ 
    foreach(object element in source) 
    { 
     yield return (T)(object)element; 
    } 
} 

所有的編譯器的信息是,它需要將對象強制轉換爲類型T.並且,對於它會使用默認的繼承鑄造。將不會使用自定義的重載操作符。在你的例子中,int不是雙精度型,因此投射失敗。

的選擇例如:

source.Select(a => (double)a)); 

作品,因爲編譯器知道這兩種類型,它是能夠調用相應的重載運算符。

+0

這裏觀察的主要內容可能是類型轉換運算符使用類型轉換_syntax_。數字類型之間的轉換是轉換運算符,而不是轉換。 – Joey 2017-04-20 13:30:35

相關問題