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

public class Foo: List<Bar>


我想通过BarDate重新排序,这是Bar上的一个属性

例如

Foo testFoo = GetFoo();

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


但是testFooFoo类型而不是List,那么我该怎么做演员?

谢谢

最佳答案

你不能那样做。您正在将对派生类的引用设置为它的基类实例不起作用。

引用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,而恰好被引用为List<Bar>,则可以撒它。例如

Foo myFoo = new Foo();
List<Bar> myList = myFoo;
Foo sameFoo = (Foo)myList;


所有三个引用(myFoomyListsameFoo)都引用完全相同的Foo实例,并且强制转换将起作用。但是,如果是这种情况:

List<Bar> actualList = new List<Bar>();
Foo listedFoo = (Foo)actualList;


然后,由于actualList不是FooFoo的派生类,所以转换将失败。

关于c# - LINQ顺序由与铸成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6356966/

10-17 02:36