這是我的代碼的簡化版本:
using System.Collections.Generic;
public abstract class FruitBox<T>
{
public T item;
public static T ChooseFirst(List<FruitBox<T>> fruitBoxes)
{
return fruitBoxes[0].item;
}
}
public class Apple
{
}
public class AppleBox : FruitBox<Apple>
{
}
public class FruitShop
{
List<AppleBox> appleBoxes = new List<AppleBox>();
public void Main()
{
AppleBox appleBox = new AppleBox();
appleBoxes.Add(appleBox);
AppleBox.ChooseFirst(appleBoxes); // => Error here
}
}
我有一個錯誤:
AppleBox.ChooseFirst(appleBoxes);
無法轉換
System.Collections.Generic.List<AppleBox>為System.Collections.Generic.List<FruitBox<Apple>>
我試過了:
AppleBox.ChooseFirst((List<FruitBox<Apple>>)appleBoxes);
但同樣的錯誤。
我該如何進行?
uj5u.com熱心網友回復:
此處解釋了這種行為的原因。簡而言之,類不支持C# 中的變化List<AppleBox>,也不支持List<FruitBox<Apple>>。你可以做什么:
- “轉換”集合(實際上是創建一個新集合):
和OfType<>().ToList()
AppleBox.ChooseFirst(appleBoxes.OfType<FruitBox<Apple>>().ToList())
要不就ToList
AppleBox.ChooseFirst(appleBoxes.ToList<FruitBox<Apple>>())
- 更改
ChooseFirst簽名以使用協變IEnumerable<out T>介面:
public abstract class FruitBox<T>
{
public T item;
public static T ChooseFirst(IEnumerable<FruitBox<T>> fruitBoxes)
{
return fruitBoxes.First().item;
}
}
uj5u.com熱心網友回復:
您必須將派生類的參考保存到基類變數中
List<FruitBox<Apple>> appleBoxes = new List<AppleBox>();
FruitBox<Apple> appleBox = new AppleBox();
appleBoxes.Add(appleBox);
appleBox.ChooseFirst(appleBoxes);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437831.html
上一篇:如何從泛型方法訪問類的方法
