Почему я получаю эти ошибки в C #? - PullRequest
1 голос
/ 07 октября 2010

EDIT:

Я избавился от большинства моих ошибок. Спасибо за вашу помощь.

Что-то не так с моим циклом while (в моем классе Form), но в основном он проверяет, кто является победителем "гонки" в моем приложении, и также запускает приложение (Shark.Swim). Как только он узнает, кто является победителем, он должен перейти к методу "выплаты" в моем классе ставок.

Так вот что у меня есть.

ПРИ ПЕТЛЯХ:

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;
        }

    }

Я думаю, что моя лучшая ставка - это перенести метод «выплаты» в основной класс форм, потому что в моем классе «Бет» нет экземпляра массива «Ставки».

Ответы [ 4 ]

1 голос
/ 07 октября 2010

Вы используете имена типов в качестве переменных экземпляра.Например:

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; }
    }
}

EDIT # 4:

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

Ошибка 4 Не удается неявно преобразовать тип 'double' в 'int'.Существует явное преобразование (вам не хватает приведения?) Лабораторная работа 3 \ Guy.cs 90 19 lab3

Тип double - более точный тип, чем тип int (в общем случае).Это означает, что он не может неявно «вставляться» в пространство памяти, выделенное для int.

Если вы используете double внутри класса Guy, то вам нужно либо изменить его на int, либобросьте его, где это уместно, или используйте удвоения на протяжении всего процесса.Двойное число допускает десятичную точку, которая, вероятно, понадобится в реальном приложении, управляющем деньгами (или, что еще лучше, десятичном типе).

РЕДАКТИРОВАТЬ # 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 (или на то свойство, которое вы используете).

0 голосов
/ 07 октября 2010

В первых двух у вас есть объект с именем Bet? Мне кажется, что Bet здесь ссылается на имя класса, а не на переменную объекта.

Цикл for должен быть для (int i=0; ...)

winner нужен капитал W (Winner)

0 голосов
/ 07 октября 2010

Для ошибки 1 проблема в том, что вы не объявили тип 'i'. Измените его на:

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

В C # /. NET, когда вы вводите новую переменную, вы должны объявить тип. (Или вы можете объявить переменную как «var», чтобы позволить компилятору выводить тип, но я бы не стал беспокоиться об этом, просто используйте int для этого.)

0 голосов
/ 07 октября 2010

Вы пытаетесь получить доступ к описанию ставки, но ставка не является экземпляром.

Bet bet = new Bet();//first
bet.Desciption; //after
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...