簡體   English   中英

C# 基類作為參數類型

[英]C# base class as parameter type

我有如下兩個類,A類繼承自B類。

public class A
{
     public string Title { get; set; }
}

public class B: A
{

}

然后我有一個如下函數,它接收 A 類項目的列表:

public static void Get(List<A> values)
{
    // Do something
}

現在,當我嘗試將 B 類項目列表傳遞給函數時,如下所示,

private function void Test()
{
     var k = new List<B>();
     Get(k);
}

我收到以下錯誤消息

無法從“System.Collections.Generic.List<B>”轉換為“System.Collections.Generic.List<A>”

這是否應該不起作用,因為 B 只是從 A 繼承並且將具有 A 所具有的屬性?

我已經花了幾個小時試圖查找這個,但我還沒有弄清楚我做錯了什么。 我該如何解決?

不,不應該。 它可能是不安全的:

class C : A {

}

public static void Get(List<A> values)
{
    values.Add(new C());
}

如果您使用new List<B>()調用Get ,那將是不安全的,因為您會在List<B>插入C實例。

但是,如果List<T>是“只讀”接口,那將是安全的,在這種情況下, covariance ,這就是您正在尋找的,將是安全的。 您可以將List<A>改為IEnumerable<A> ,它會起作用。

盡管B可以在A任何地方使用,但List<B>List<A>不是協變的 但是,從 .NET 4.0 開始,您可以使用Derived類列表代替IEnumerable<Base> 因此,如果您聲明您的函數采用IEnumerable<A>而不是List<A> ,您的代碼將被編譯。

B 確實從 A 繼承,但這並不意味着List<B> Inherits from List<A>您應該將 B 對象放入List<A>並將其傳遞給方法。 這就是多態性的全部內容。

  private function void Test()
  {
      var k = new List<A>();
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      Get(k);
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM