无法将类型为'System.Linq.OrderedEnumerable`2 [***]'的对象强制转换为'System.Collections.Generic.IEnumerable`1 [***]'

时间:2013-06-12 17:33:52

标签: c# generics collections

我有一个继承自Token类的对象DirectoryToken。在我的代码中,我有一个GetValues方法,它接受一个令牌列表,并根据令牌对象中包含的信息将列表中每个项目的值放在一起。

//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 [令牌]”类型的对象。

我认为更改代码不是解决此问题的正确方法。任何建议可能是什么问题,也许是什么版本我可以更新我的3.5,以解决这个问题?

2 个答案:

答案 0 :(得分:3)

您正在尝试将DirectoryToken的集合转换为Token的集合。

这称为协变转换,仅在.Net 4.0或更高版本中受支持。

如果无法升级,可以调用.Cast<Token>()创建一个新的IEnumerable<T>实例(实际上是一个迭代器),将每个对象转换为所需的类型。

在任何情况下都不需要显式的强制转换操作。

答案 1 :(得分:1)

是的,还没到那里。

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

会奏效。

这是因为虽然DirectoryTokenToken,但IEnumerable<DirectoryToken> IEnumerable<Token>。你不能直接施展。