2013-06-12 152 views
1

我有一個對象DirectoryToken繼承自類令牌。在我的代碼中,我有一個GetValues方法,該方法獲取標記列表,並根據標記對象中包含的信息將每個項目的值放在列表中。無法投入'System.Linq.OrderedEnumerable`2 [***]'類型的對象來鍵入'System.Collections.Generic.IEnumerable`1 [***]'

//NameTokens is an object of type **List<DirectoryToken>** 
    List<String> PathValues = GetValues((IEnumerable<Token>)settings.DirectoryDefinition.**NameTokens**.OrderBy(x => x.Index)); 


    private List<String> GetReportValues(IEnumerable<Token> TokenList) 
    { 

    } 

我注意到當我在一臺機器上運行代碼(Windows 7,.NET 3.5)時,它運行良好。但是,當我將構建的msi移動到另一臺機器並嘗試運行相同的測試時,出現以下錯誤消息。

無法投射「System.Linq.OrderedEnumerable」類型的對象2[DirectoryToken,System.Int32]' to type 'System.Collections.Generic.IEnumerable 1 [Token]'。

我不認爲改變代碼是正確的方法來解決這個問題。任何建議這個問題可能來自什麼,也許什麼版本我可以更新我的3.5,以解決這個問題?

回答

3

您正試圖將DirectoryToken的集合轉換爲Token的集合。

這被稱爲covariant轉換,它只支持.Net 4.0或更高版本。

如果您不能升級,您可以撥打.Cast<Token>()創建一個新的IEnumerable<T>實例(實際上是一個迭代器),它將每個對象轉換爲所需的類型。

在任何情況下,您都不需要顯式的投射操作。

1

沒錯,還沒有。

List<String> PathValues = GetValues(settings.DirectoryDefinition.NameTokens.OrderBy(x => x.Index).Cast<Token>()); 

將工作。

這是因爲雖然DirectoryTokenTokenIEnumerable<DirectoryToken>IEnumerable<Token>。你不能直接施放。

相關問題