所以我有一个继承列表的对象。
public class Foo: List<Bar>
我想通过
BarDate
重新排序,这是Bar
上的一个属性例如
Foo testFoo = GetFoo();
testFoo = testFoo.OrderBy(b => b.BarDate).ToList();
但是
testFoo
是Foo
类型而不是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;
所有三个引用(
myFoo
,myList
和sameFoo
)都引用完全相同的Foo
实例,并且强制转换将起作用。但是,如果是这种情况:List<Bar> actualList = new List<Bar>();
Foo listedFoo = (Foo)actualList;
然后,由于
actualList
不是Foo
或Foo
的派生类,所以转换将失败。关于c# - LINQ顺序由与铸成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6356966/