2009-12-14 82 views

回答

7

這是CastToArray一個bug,IMO。在這個答案中的代碼是在C#中,但希望你可以看到它是關於:)

我相信Cast首先試圖看看是否一個簡單的參考轉換將工作 - 即它可以返回相同的參考返回。

例如:

String x = "hello"; 
IEnumerable<char> y = x.Cast<char>(); 
Console.WriteLine(object.ReferenceEquals(x, y)); // Prints true 

不幸的是,它這樣做使用CLR規則兼容性 - 在其下UInt16[]Int16[]兼容。導致這種情況的發生:

short[] array = new short[]{4, 5, 6}; 
IEnumerable<ushort> cast = array.Cast<ushort>(); 
Console.WriteLine(object.ReferenceEquals(array, cast)); // Prints True 

不幸的是,如果你再嘗試撥打ToArray(),它不是高興:

// Explicit type argument just for clarity 
cast.ToArray<ushort>(); // Bang 

ToArray無疑會嘗試做一些優化 - 這無法在這種特殊情況下,因爲類型並不是它真正期望的那樣。

我相信正確行爲應該是爲Cast返回一個懶惰的迭代器,但爲此以後執行失敗。例如,如果您嘗試從Int16Int32,就會發生這種情況。

現在,回到真的想要做的事情:改用Select來代替。 Cast僅用於拆箱操作和參考類型轉換。

+0

謝謝,不幸的是我還沒有關於LINQ的知識,你知道,我總是有更多的事情要做。無論如何,再次感謝。 – 2009-12-14 13:47:07

5

因爲Int16UInt16是不同的類型。你可以試試這個:

New Int16() {4, 5, 6}.Select(Function(x) CType(x, UInt16)).ToArray() 
+0

這就是爲什麼我打電話演員是不是?如果他們在哪裏相同的類型不需要Cast。 – 2009-12-14 12:23:24

+0

'Cast'只在類型兼容時才起作用(一個來自另一個)。 'Int16'和'UInt16'沒有什麼共同之處。 – 2009-12-14 12:26:25

+0

好吧,有沒有辦法用CType而不是DirectCast做同樣的事情? – 2009-12-14 12:29:23

相關問題