首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq order by with cast as

Linq order by with cast as
EN

Stack Overflow用户
提问于 2011-06-15 19:25:44
回答 2查看 3.2K关注 0票数 1

所以我有一个继承列表的对象。

代码语言:javascript
复制
public class Foo: List<Bar>

我想通过Bar上的属性BarDate对其进行重新排序

例如

代码语言:javascript
复制
Foo testFoo = GetFoo();

testFoo = testFoo.OrderBy(b => b.BarDate).ToList();

但是testFoo的类型是Foo,而不是List,所以我怎么能进行造型呢?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-15 19:39:55

你不能这么做。您正在设置对派生类的引用,这是它的基类的一个实例,这将不起作用。

引用testFoo只能是Foo或从Foo派生的对象(List<Bar>Foo的基类)

但是,您可以这样做:

代码语言:javascript
复制
public class Foo : List<Bar>
{
    public Foo()
    {}

    public Foo(IEnumerable<Bar> collection)
        : base(collection)
    {}
}

在后面的代码中:

代码语言:javascript
复制
Foo testFoo = new Foo();
testFoo = new Foo(testFoo.OrderBy(b => b.BarDate));

LINQ表达式将返回一个IEnumerable<Bar>,因此与List<T>的构造函数之一兼容

顺便说一下,编译器错误消息显示“存在显式转换(是否缺少强制转换?)”的原因。是因为如果你有一个对象,它是一个恰好被作为List<Bar>引用的Foo,那么你可以对它进行强制转换。例如:

代码语言:javascript
复制
Foo myFoo = new Foo();
List<Bar> myList = myFoo;
Foo sameFoo = (Foo)myList;

所有三个引用(myFoomyListsameFoo)都引用完全相同的Foo实例,并且类型转换可以正常工作。但是,如果是这种情况:

代码语言:javascript
复制
List<Bar> actualList = new List<Bar>();
Foo listedFoo = (Foo)actualList;

那么强制转换将失败,因为actualList不是FooFoo的派生。

票数 4
EN

Stack Overflow用户

发布于 2011-06-15 19:41:51

ToList()返回一个新的List<Bar>。没有办法取回Foo对象。这是您不应该从List继承的原因之一。

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

https://stackoverflow.com/questions/6356966

复制
相关文章

相似问题

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