2014-11-06 20 views
1

假設我有以下類定義返回繼承類型:從方法

Public Class BaseClass 
    ... 
End Class 

Public Class DerivedClass 
    Inherits BaseClass 

    ... Extra Fields, methods, etc ... 
End Class 

,然後在我的代碼,我有一個函數的簽名:

Public Function DoSomething(...) As List(Of BaseClass) 

當我嘗試並返回從中List(Of DerivedClass)類型的對象,我得到的錯誤:

Value of type 'System.Collections.Generic.List(Of BaseClass)' cannot be converted to 'System.Collections.Generic.List(Of DerivedClass)'

我知道不是所有額外的DerivedClass字段都會被填滿,但它會給我所需要的。

有沒有辦法做到這一點,或者這只是被認爲是不好的編程習慣?而且,如果是這樣,那麼執行此操作的正確方法是什麼?

回答

2

看一看這樣的:

http://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx

瞭解協變和逆變將清除了一點東西:)

  • 協方差

允許您使用比原先指定的更具體的類型。 您可以將IEnumerable(IEnumerable(Of Derived)在Visual Basic中)的實例分配給IEnumerable類型的變量。

實施例:

IEnumerable<Derived> d = new List<Derived>(); 
IEnumerable<Base> b = d; 
  • 逆變

允許您使用一個更通用的(較少衍生)型比最初指定。 您可以將IEnumerable(IEnumerable(Of Base)在Visual Basic中)的實例分配給IEnumerable類型的變量。

實施例:

Action<Base> b = (target) => { Console.WriteLine(target.GetType().Name); }; 
Action<Derived> d = b; 
d(new Derived()); 
  • 不變性

意味着只能使用最初指定的類型;所以一個不變的泛型類型參數既不是協變也不是逆變。您不能將IEnumerable(IEnumerable(Of Base)在Visual Basic中)的實例分配給IEnumerable類型的變量,反之亦然。

+0

這**真的**幫助! - 非常感謝!! - 只要計時器允許,我會盡快接受解決方案。 – 2014-11-06 18:48:46

+0

如果您可以在鏈接中添加一些關鍵點的解釋,這將是一件好事,這僅僅是一個僅用於鏈接的答案。 – 2014-11-06 20:13:04

+0

對不起,作爲一個完全白癡,但我完全理解你在這裏說的伊恩的邏輯,但我仍然堅持執行部分...我張貼了另一個問題,我希望你或其他人冷實際上告訴我它是如何做的一次..。你再次! – 2014-11-07 16:10:18