首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >升压泛型

升压泛型
EN

Stack Overflow用户
提问于 2014-04-17 23:26:10
回答 2查看 984关注 0票数 3

好吧,我知道这是不可能的,但我想知道是否有人知道如何绕过这个问题。

代码语言:javascript
运行
复制
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),并且不允许我以这种方式转换它。有什么办法可以绕过吗?

更新:

下面是我试图解决的一个更接近的例子:

代码语言:javascript
运行
复制
List<int> testList = new List<int>();

var qry = new EnumerableQuery<int>( testList );

var objectQry = (IQueryable<object>)qry;

虽然此示例不会产生编译时错误,但在尝试运行时确实会产生强制转换异常。由于某些原因,即使IQuerable是协变的(谢谢Servy对此的评论),一旦我引入了一个实现类,比如EnumerableQuery,它就会失败。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-18 15:33:32

您需要构造每个新字典的副本,因为字典和列表对于它们的任何泛型参数都不是协变的。

(通过Keys属性和对本身的序列在输出中也提供了键,因此即使IDictionary<TKey, TValue>也不能对TKey进行协变。)

您可以使用Select将每个对象映射到一个新对象:

代码语言:javascript
运行
复制
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也是协变的,因此可以对这些类型的接口进行转换:

代码语言:javascript
运行
复制
IQueryable<IGrouping<dynamic, int>> query = null;
IQueryable<IGrouping<object, int>> otherQuery = query;

它编译并运行得很好。

票数 2
EN

Stack Overflow用户

发布于 2014-04-17 23:35:06

尝尝这个。

代码语言:javascript
运行
复制
List<int> numberList = new List<int>();
List<object> objectList = numberList.Cast<object>().ToList();

Enumerable.Cast

将IEnumerable的元素转换为指定的类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23145117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档