2011-06-15 120 views
1

所以我有一個對象繼承了一個列表。Linq排序依據爲

public class Foo: List<Bar> 

而且我想通過BarDate重新安排它這是對Bar

屬性例如

Foo testFoo = GetFoo(); 

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

testFooFoo類型不List的我怎麼可能做演員?

謝謝

+1

我只是跑這個代碼,它工作正常。它不應該是一個問題,因爲'Foo'實現'IEnumerable'和'IEnumerable '。你收到什麼錯誤信息? – aligray 2011-06-15 11:34:53

+1

它的工作原理?我得到一個編譯器錯誤:不能隱式地將類型'System.Collections.Generic.List '轉換爲'ConsoleApplication1.Foo'。存在明確的轉換(您是否缺少演員?) – 2011-06-15 11:42:53

回答

4

你不能那樣做。你正在設置一個派生類的引用,它的基礎實例將不起作用。

testFoo只能是FooFoo派生的對象的引用(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; 

所有這三個引用(myFoomyListsameFoo)所有參考完全相同的Foo實例和鑄造會工作。但是,如果是這樣的情景:

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

然後投將失敗,因爲actualList不是FooFoo衍生物。

0

ToList()返回新的List<Bar>。沒有辦法得到一個Foo對象。 這是您不應該從List繼承的原因之一。

+1

我不太確定這是「您不應該從列表繼承的原因之一」。從列表繼承可能有很多很好的理由,包括添加不在列表中的其他功能。但是如果你想讓你的Foo對象返回(你永遠不會得到它,因爲如果你堅持使用List,你永遠不會得到你的原始List,只有一個新的List),那麼就不要失去對它的引用。 – 2011-06-15 11:47:45

+0

列表沒有虛擬方法來覆蓋,所以這是沒有用的。如果你添加了新的字段,它們就像海報那樣是失落的,因爲LINQ不會返回你的舊List對象,只返回它的元素。 – codymanix 2011-06-15 12:05:52

+0

在這種情況下,它對於我繼承列表非常有用,但我明白了你的觀點 – 2011-06-24 15:41:19