Cal*_*ers 1 .net c# generics ienumerable interface
可能重复:
上传和通用列表
好的,我想发送一个List<CardHolder>作为一个IEnumerable<ICardHolder>地方CardHolder : ICardHolder.但是,编译器错误:
错误4参数'1':无法从'System.Collections.Generic.List'转换为'System.Collections.Generic.IEnumerable'
考虑到这一点,这对我来说似乎很奇怪List<T> : IEnumerable<T>.出了什么问题?
public interface ICardHolder
{
List<Card> Cards { get; set; }
}
public class CardHolder : ICardHolder
{
private List<Card> cards = new List<Card>();
public List<Card> Cards
{
get { return cards; }
set { cards = value; }
}
// ........
}
public class Deck : ICardHolder
{
// .........
public void Deal(IEnumerable<ICardHolder> cardHolders)
{
// ........
}
// .........
}
public class Game
{
Deck deck = new Deck();
List<CardHolder> players = new List<CardHolder>();
// .........
deck.Deal(players); // Problem is here!
// .........
}
Run Code Online (Sandbox Code Playgroud)
问题是,即使List<T>是子类型IEnumerable<T1>也不是T : T1.
C#中的泛型(在C#4.0之前)是"不变的"(即没有这种子类型关系).在.Net 4中,IEnumerable<T>将其类型参数注释为'covariant'.这意味着List<T> 它将是IEnumerable<T1>if 的子类型T : T1.
有关此功能的详细信息,请参阅MSDN上的此页面.
编辑 - 您可以通过使Deal方法通用来解决此问题:
public void Deal<T>(IEnumerable<T> cardHolders) where T : ICardHolder
{
// ........
}
Run Code Online (Sandbox Code Playgroud)