[英]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.