我有一个继承自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,以解决这个问题?
答案 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>());
会奏效。
这是因为虽然DirectoryToken
是Token
,但IEnumerable<DirectoryToken>
不是IEnumerable<Token>
。你不能直接施展。