C# 尝试使用枚举填充列表,但得到';类型';像';变量';

C# 尝试使用枚举填充列表,但得到';类型';像';变量';,c#,types,enums,C#,Types,Enums,我正在创建一副卡片,并将我的套装和值放在枚举中,但我的语法在尝试填充列表时出错。另外,Ace的值可以是1或11,是否有办法将其合并到我的枚举中,或者在执行诸如21点手数求和之类的操作时,我是否需要将其编码 public class Deck { private List<Card> cards; private Random random = new Random(); public Deck() { cards = new List&

我正在创建一副卡片,并将我的套装和值放在枚举中,但我的语法在尝试填充列表时出错。另外,Ace的值可以是1或11,是否有办法将其合并到我的枚举中,或者在执行诸如21点手数求和之类的操作时,我是否需要将其编码

public class Deck
{
    private List<Card> cards;
    private Random random = new Random();
    public Deck()
    {
        cards = new List<Card>();
        for (int s = 0; s < 4; s++)
            //for (int v = 0; v < 14; v++)
            foreach(Enum v in Values)
                cards.Add(new Card((Suits)s, (Values)v));
    }

您的问题是这一行:

foreach(Enum v in Values)
您不能以这种方式枚举
enum
Values
是您的
enum
类型声明的名称。。不是一组值

不过,您可以这样做:

foreach (var v in Enum.GetValues(typeof(Values)))
您需要使用获取枚举的所有值的数组

然后,您应该能够执行类似的操作(不确定这是否可以编译,但您应该知道):

不过,我认为您的值枚举无法正常工作。一旦您使用
Ten
King
之间的一个值初始化了某个对象,您将无法分辨它最初是什么

我认为您需要类似的东西(也可以将您的多元枚举名称重命名为单数,以匹配正常的命名约定):

您还可以使用Linq初始化
列表,如下所示:

List<Card> cards = 
(
    from suit in Enum.GetValues(typeof(Suit)).OfType<Suit>()
    from rank in Enum.GetValues(typeof(Rank)).OfType<Rank>()
    select new Card(suit, rank)
).ToList();
然后,无论您在哪里拥有
Rank
,都可以使用
Rank.Value()
,例如,卡的
ToString()
将变成:

public override string ToString()
{
    return _rank + " of " + _suit + " with value " + _rank.Value();
}

这是可行的,但现在当我打印卡片名称时,我得到了所有人脸卡的“十”字。这是我的相关卡片类信息:公共类卡片{public casts suit{get;set;}公共值值{get;set;}公共卡(suts{u suit,Values{u value){this.suit=\u suit;this.value=\u value;}公共字符串名称{get{return value.ToString()+”of“+suit.ToString();}}}public override string ToString(){return Name;}value.ToString()适用于Ace、Two等,但所有的人脸卡都显示为“十”这是因为它们都有相同的值。
Ten
Jack
Queen
King
在较低的级别上都是相同的。它们都等于10。您无法区分它们。可能是
public enum Suit
{
    Spades,
    Clubs,
    Diamonds,
    Hearts
}

public enum Rank
{
    Ace   = 1,
    Two   = 2,
    Three = 3,
    Four  = 4,
    Five  = 5,
    Six   = 6,
    Seven = 7,
    Eight = 8,
    Nine  = 9,
    Ten   = 10,
    Jack  = 11,
    Queen = 12,
    King  = 13
}

class Card
{
    readonly Suit _suit;
    readonly Rank _rank;

    public Card(Suit suit, Rank rank)
    {
        _suit = suit;
        _rank = rank;
    }

    public Rank Rank
    {
        get
        {
            return _rank;
        }
    }

    public Suit Suit
    {
        get
        {
            return _suit;
        }
    }

    public int Value
    {
        get
        {
            if (Rank >= Rank.Ten)
            {
                return 10;
            }
            else
            {
                return (int) Rank;
            }
        }
    }

    public override string ToString()
    {
        return _rank + " of " + _suit + " with value " + Value;
    }
}
List<Card> cards = 
(
    from suit in Enum.GetValues(typeof(Suit)).OfType<Suit>()
    from rank in Enum.GetValues(typeof(Rank)).OfType<Rank>()
    select new Card(suit, rank)
).ToList();
static class RankExt
{
    public static int Value(this Rank rank)
    {
        if (rank >= Rank.Ten)
        {
            return 10;
        }
        else
        {
            return (int)rank;
        }
    }
}
public override string ToString()
{
    return _rank + " of " + _suit + " with value " + _rank.Value();
}