在C#中,我有一个类MyObj,它实现了一个接口IMyInterface。在C#中,为什么从对象列表到接口列表的转换抛出异常?
我现在有MyObj中类的列表的集合:
IEnumerable<List<MyObj>> myObjGroups
,我希望把它转换/转换为
IEnumerable<List<IMyInterface>> myInterfaceGroups
,一切我都试过已抛出异常。
“”类型的异常出现在System.Core.dll但在用户代码中没有处理 其他信息:无法转换类型的对象“System.Collections.Generic.List ` 1 [MyObj中]'键入'System.Collections.Generic.List ` 1 [IMyInterface]'。
我曾尝试:
IEnumerable<List<IMyInterface>> myInterfaceGroups= new List<List<IMyInterface>>(myObjGroups.Cast<List<IMyInterface>>());
和:
IEnumerable<List<IMyInterface>> myList = myObjGroups.Cast<List<IMyInterface>>();
两者似乎在运行时抛出异常。
关于我在做什么错的任何建议?
'名单'不是'名单'所以演员表无效。你可以使用IEnumerable >'。如果你需要内部列表然后'myObjGroups.Select(l => l.Cast ()。ToList())'。 –
Lee
就像@李说的那样,一个'List'不是'List '。这是因为'List '在'T'中不是协变的(它不是'List ')。那是因为这个类有成员,比如'Add'方法,使得协变不可能。一个接口,例如'IReadOnlyList '可以工作。如果只是'MyObj'是一个实现'IMyInterface'的引用类型,'IReadOnlyList '是一个'IReadOnlyList '。 'IEnumerable '是协变的。 –