所以我有一個對象繼承了一個列表。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