2013-03-04 18 views
2

我最近遇到了一個問題,使用它的用戶定義的強制轉換(cast operator overload)與linq的Cast方法一起使用。爲什麼我不能使用linq的Cast與用戶定義的強制轉換,但是我可以在Select調用中使用它?

我在SO發現了一個關於我的問題的similar question,我還發現了一個解釋得很好的link。我的問題解決了。

但有些事讓我疑惑:

爲什麼這不起作用:

foolist.Cast<bar>(); // throws InvalidCastException 

,而這個工程:

foolist.Select(f => (bar)f).ToList(); // works fine 

我認爲,這是關係到每一個執行的東西方法。如果是這樣,Cast方法不能有類似於Select的實現,允許它與用戶定義的強制轉換一起使用(因爲這是有點期待的)。

注:我不是問爲什麼失敗。我在問爲什麼Cast方法是以失敗的方式編寫的。

+4

這與您所鏈接的問題完全相同 - 您的問題與您列出的問題相比有何新變化? – 2013-03-04 21:00:51

+0

@ReedCopsey我明白爲什麼Cast方法失敗。我不明白爲什麼這樣實施(因爲我可以輕鬆解決它)。 – talles 2013-03-04 21:09:42

+0

主持人是否可以查看我添加的註釋並檢查*是否重複。鏈接的問題(我在我的問題中也將自己聯繫在一起)解釋了爲什麼**,但它沒有解釋**爲什麼它是這樣的**。 – talles 2013-03-04 21:20:31

回答

0

之所以是,Cast方法執行在通用上下文

IEnumerable<T> Cast<T>(this IEnumerable e) { 
    foreach (object cur in e) { 
    return (T)cur; 
    } 
} 

實際鑄造邏輯被驗證,並在此確切點發射的鑄造。這一點是通用函數,並且不知道用戶定義的轉換類型T最終實例化爲。它有權訪問的是標準的CLR樣式轉換。

在第二個示例中,您正在對實型(不是泛型類型參數)進行強制轉換。因此,C#編譯器可以訪問該對象上的所有用戶定義的轉換,並且可以插入最合適的轉換。

+0

不能'_'_'這個IEnumerable e')? – talles 2013-03-04 21:05:38

+0

@talles它可以輸入,但它不會幫助。演員現場仍然會處理類型參數 – JaredPar 2013-03-04 21:14:40

相關問題