Linq命令与演员一样

时间:2011-06-15 11:25:44

标签: c# linq

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

public class Foo: List<Bar>

我希望按BarDate <{1}}上的Bar重新排序。Foo testFoo = GetFoo(); testFoo = testFoo.OrderBy(b => b.BarDate).ToList();

例如

testFoo

Foo的类型为List而不是{{1}},那么我该如何进行投射?

由于

2 个答案:

答案 0 :(得分:4)

你做不到。您正在为派生类设置对其基础的实例的引用,该实例将不起作用。

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

但是,您可以这样做:

public class Foo : List<Bar>
{
    public Foo()
    {}

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

稍后在您的代码中:

Foo testFoo = new Foo();
testFoo = new Foo(testFoo.OrderBy(b => b.BarDate));

LINQ表达式将返回IEnumerable<Bar>,因此与List<T>

的一个构造函数兼容

顺便提一下,编译器错误消息显示“存在显式转换(您是否错过了转换?)”的原因是因为如果您有一个真正属于Foo的对象恰好被引用为{ {1}}然后你可以施展它。 e.g。

List<Bar>

所有三个引用(Foo myFoo = new Foo(); List<Bar> myList = myFoo; Foo sameFoo = (Foo)myList; myFoomyList)都引用完全相同的sameFoo实例,并且转换将起作用。但是,如果是这种情况:

Foo

然后演员表会失败,因为List<Bar> actualList = new List<Bar>(); Foo listedFoo = (Foo)actualList; 不是actualListFoo的衍生物。

答案 1 :(得分:0)

ToList()会返回新的List<Bar>。无法获得Foo对象。 这是您不应继承List

的原因之一