将List <T>作为IEnumerable <T>发送到方法的一些问题

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)

Ben*_*ngs 7

问题是,即使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)