好吧,我知道这是不可能的,但我想知道是否有人知道如何绕过这个问题。
List<int> numberList = new List<int>();
List<object> objectList = (List<object>)numberList;这会产生以下错误:
无法将“System.Collections.Generic.List{int}”类型转换为“System.Collections.Generic.List{object}”
这是一个简单的例子,但这是我真正的问题。我有一个动态生成IQueryable{IGrouping{TKey, TElement}}实例的方法。但是,由于在我的示例中TKey是动态生成的,所以我只能向调用方返回一个IQueryable。
我希望能够将一个IQueryable{IGrouping{dynamic, TElement}}返回给调用者。但是,编译器会抱怨,因为就像我在第一个示例中一样,它将TKey转换为一个对象(用于dynamic),并且不允许我以这种方式转换它。有什么办法可以绕过吗?
更新:
下面是我试图解决的一个更接近的例子:
List<int> testList = new List<int>();
var qry = new EnumerableQuery<int>( testList );
var objectQry = (IQueryable<object>)qry;虽然此示例不会产生编译时错误,但在尝试运行时确实会产生强制转换异常。由于某些原因,即使IQuerable是协变的(谢谢Servy对此的评论),一旦我引入了一个实现类,比如EnumerableQuery,它就会失败。
发布于 2014-04-18 15:33:32
您需要构造每个新字典的副本,因为字典和列表对于它们的任何泛型参数都不是协变的。
(通过Keys属性和对本身的序列在输出中也提供了键,因此即使IDictionary<TKey, TValue>也不能对TKey进行协变。)
您可以使用Select将每个对象映射到一个新对象:
List<Dictionary<int, string>> listOfDicts = new List<Dictionary<int, string>>();
List<Dictionary<object, string>> newList = listOfDicts.Select(dic =>
dic.ToDictionary(pair => (object)pair.Key, pair => pair.Value))
.ToList();另一方面,IQueryable<T>是协变的,IGrouping也是协变的,因此可以对这些类型的接口进行转换:
IQueryable<IGrouping<dynamic, int>> query = null;
IQueryable<IGrouping<object, int>> otherQuery = query;它编译并运行得很好。
发布于 2014-04-17 23:35:06
尝尝这个。
List<int> numberList = new List<int>();
List<object> objectList = numberList.Cast<object>().ToList();Enumerable.Cast
将IEnumerable的元素转换为指定的类型。
https://stackoverflow.com/questions/23145117
复制相似问题