所以我有一个对象继承了一个列表。Linq排序依据为
public class Foo: List<Bar>
而且我想通过BarDate
重新安排它这是对Bar
属性例如
Foo testFoo = GetFoo();
testFoo = testFoo.OrderBy(b => b.BarDate).ToList();
但testFoo
是Foo
类型不List
的我怎么可能做演员?
谢谢
所以我有一个对象继承了一个列表。Linq排序依据为
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表达式wi会返回一个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
衍生物。
ToList()
返回新的List<Bar>
。没有办法得到一个Foo
对象。 这是您不应该从List
继承的原因之一。
我不太确定这是“您不应该从列表继承的原因之一”。从列表继承可能有很多很好的理由,包括添加不在列表中的其他功能。但是如果你想让你的Foo对象返回(你永远不会得到它,因为如果你坚持使用List,你永远不会得到你的原始List,只有一个新的List),那么就不要失去对它的引用。 – 2011-06-15 11:47:45
列表没有虚拟方法来覆盖,所以这是没有用的。如果你添加了新的字段,它们就像海报那样是失落的,因为LINQ不会返回你的旧List对象,只返回它的元素。 – codymanix 2011-06-15 12:05:52
在这种情况下,它对于我继承列表非常有用,但我明白了你的观点 – 2011-06-24 15:41:19
我只是跑这个代码,它工作正常。它不应该是一个问题,因为'Foo'实现'IEnumerable'和'IEnumerable'。你收到什么错误信息? –
aligray
2011-06-15 11:34:53
它的工作原理?我得到一个编译器错误:不能隐式地将类型'System.Collections.Generic.List'转换为'ConsoleApplication1.Foo'。存在明确的转换(您是否缺少演员?) –
2011-06-15 11:42:53