所以我有一个继承列表的对象。
public class Foo: List<Bar>
我希望按BarDate
<{1}}上的Bar
重新排序。Foo testFoo = GetFoo();
testFoo = testFoo.OrderBy(b => b.BarDate).ToList();
例如
testFoo
但Foo
的类型为List
而不是{{1}},那么我该如何进行投射?
由于
答案 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;
,myFoo
和myList
)都引用完全相同的sameFoo
实例,并且转换将起作用。但是,如果是这种情况:
Foo
然后演员表会失败,因为List<Bar> actualList = new List<Bar>();
Foo listedFoo = (Foo)actualList;
不是actualList
或Foo
的衍生物。
答案 1 :(得分:0)
ToList()
会返回新的List<Bar>
。无法获得Foo
对象。
这是您不应继承List
。