为什么我在C#中遇到这些错误?

时间:2010-10-07 04:45:47

标签: c# winforms visual-studio-2010

编辑:

我摆脱了大部分错误。谢谢你的帮助。

我的while循环(在我的Form类中)有问题,但基本上,它会测试看看“race”的获胜者是谁在我的应用程序中,它还启动了应用程序(Shark.Swim)。一旦找到胜利者是谁,就需要在我的投注类中获得“支付”方法。

所以这就是我所拥有的。

WHILE LOOP:

private void raceBtn_Click(object sender, EventArgs e)
    {
        public int[] finishingOrder = new int[4];
        bool sharkFinished = false;
        public int place = 1;
        public int numSharksFinished;

while (numSharksFinished < 4)
        {
            sharkFinished = false;
            for (int i = 0; i < 4; i++)
            {
                if (finishingOrder[i] == -1)
                {
                    if (sharks[fish].Swim();)
                    {
                        finishedOrder[i] = place;
                        sharkFinished = true;
                        numSharksFinished++;
                    }
                }
                if(sharkFinished = true) 
                {
                   place++;
                }
            }
        }

PAYOUT:

public double payout(int pool, int sharkPool)
    {
        for (int j = 0; j < 3; j++)
        {
            Guy[j].cash += Bets[i, j].Amount;
        }

    }

我认为最好的办法是将“payout”方法移到主窗体类中,因为我的Bet类中没有“Bets”数组的实例。

4 个答案:

答案 0 :(得分:1)

您正在使用类型名称作为实例变量。例如:

return cash += Bet.payout(pool, sharkPool);

如果Bet.payout()不是静态方法,那么你需要先创建一个Bet实例来调用这个方法。

例如:

Bet b = new Bet();
return cash + b.payout(pool, sharkPool);

这似乎是几个不同地方的问题。

编辑:添加更多建议。

Bet EmptyBet { get { return new Bet() { amount = 0, fish = 0, better = this }; }

这里的问题是您在静态访问器中使用实例引用(this)。将静态成员视为某事物的唯一副本。因此,它不知道实例(即特定的,类型的唯一出现)。

我不确定better代表什么,但鉴于上下文,您无法将其分配给this

编辑#2:这是我嘲笑的一个小课程,以帮助您了解如何创建一个将返回默认投注的静态成员。

    public class Bet
    {
        #region instance members

        public decimal Amount
        {
            get;
            set;
        }

        public string Description
        {
            get;
            set;
        }

        public void Payout()
        {
            // do something
        }

        #endregion

        #region static members

        public static Bet Empty
        {
            get
            {
                Bet b = new Bet();
                b.Amount = 0M;
                b.Description = "Default Empty Bet";

                return b;
            }
        }

        #endregion
    }

编辑#3:使用访问者声明实例属性

//
// This will not compile because members have been defined more than once
public class Bet
{
    // You can declare smart properties with default initializers
    // by not declaring a body for the get/set accessors

    public decimal Amount
    {
        get;
        set;
    }

    public string Description
    {
        get;
        set;
    }

    // OR, you can declare private variables and expose them
    // publicly via get/set accessors. This gives flexibility
    // in internal manipulation (sometimes) but creates more code

    private decimal _amount = 0M;

    public decimal Amount
    {
        get { return _amount; }
        set { _amount = value; }
    }
    private string _description = string.Empty;

    public string Description
    {
        get { return _description; }
        set { _description = value; }
    }
}

编辑#4:

public void collect(int pool, int sharkPool)
{
    return cash += betClass.payout(pool, sharkPool);
}
  

错误4无法隐式转换类型   'double'到'int'。一个明确的   转换存在(你错过了吗?   演员?)Lab 3 \ Guy.cs 90 19 lab3

double是比int更精确的类型(一般来说)。这意味着它不能被隐式“填充”到为int分配的内存空间中。

如果你在Guy类中使用了double,那么你需要将它更改为int,或者在适当的地方使用它,或者在整个过程中使用double。 double允许小数点,这可能在管理货币的实际应用程序中需要(或者更好的是十进制类型)。

编辑#5:

private int winningSharkTotal(int Winner)
{
int Result = 0;


for (int i = 0; i<3; i++)
{
    Result += bets[i+(Winner*3)];

}
    return Result;


}

这个错误的东西......首先,你的变量的外壳确实令人困惑,因为当大多数c#程序员看到一个大写的变量名时,它看起来像一个类型,而不是一个方法参数(注意SO编辑器如何格式错误)。

第二件事,我不知道你想用这个来实现什么逻辑:

bets[i+(Winner*3)]

无论i + (winner * 3)等于将使用的数组索引。这充其量是模棱两可的。也许你试图将获胜者的收入增加两倍?

最后,bet[index]将返回Bet对象,而不是int。你需要更像bet[index].Amount的东西(或者你正在使用的属性)。

答案 1 :(得分:0)

您尝试访问Bet的描述,但Bet不是实例。

Bet bet = new Bet();//first
bet.Desciption; //after

答案 2 :(得分:0)

对于错误1,问题是您没有声明'i'的类型。将其更改为:

for (int i = 0; i < bets.Length; i++)

在C#/ .NET中,当您引入新变量时,您必须声明类型。 (或者您可以将变量声明为“var”以让编译器推断出类型,但我现在不担心,只需使用int。)

答案 3 :(得分:0)

在前两个,你有一个名为Bet的对象吗?在我看来,Bet这里指的是类名,而不是对象变量。

for循环应该是(int i=0; ...)

winner需要大写字母W(Winner