2010-10-07 5 views
1

EDIT:Почему я получаю эти ошибки на C#?

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

Что-то не так с моим циклом while (в моем классе Form), но в основном, он проверяет, кто победитель «гонки» в моем приложении, и он также запускает приложение (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; 
     } 

    } 

Я думаю, что моя лучшая ставка выведя "выплаты" метод для основного класса формы, потому что нет ни одного случая из «ставка «Массив в моем классе ставок.

+0

C# чувствителен к регистру –

+0

, что вы имеете в виду? Я не вижу, как это относится ко всем моим ошибкам. – eightonrose

+0

Вы пытались прочитать документацию по этим ошибкам? Из, например, google? –

ответ

1

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

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

Если Bet.payout() не является статическим методом, то вам необходимо создать экземпляр Bet первым, чтобы вызвать этот метод.

Например:

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

Это, как представляется, проблема в нескольких разных местах.

EDIT: добавлено еще несколько предложений.

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

Проблема здесь состоит в том, что вы используете ссылку на экземпляре (this) внутри статического аксессора. Подумайте о статическом члене как о единственной копии чего-то. Таким образом, он не знает о экземплярах (т. Е. Конкретных, уникальных вхождениях типа).

Я не уверен, что представляет better, но вы не можете назначить его this, учитывая контекст.

EDIT # 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); 
} 

Error 4 Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?) Lab 3\Guy.cs 90 19 lab3

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

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

EDIT # 5:

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


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

} 
    return Result; 


} 

пару вещей неправильно с этим ... первый, корпус ваших переменных действительно сбивает с толку, потому что, когда большинство C# программисты видят прописную имя переменной, это выглядит как type, а не параметр метода (обратите внимание, как редактор SO неправильно форматирует его).

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

bets[i+(Winner*3)] 

Независимо i + (winner * 3) равно будет индекс массива, который используется. В лучшем случае это двусмысленно. Возможно, вы пытались утроить прибыль победителя?

Наконец, bet[index] вернет объект ставки, а не инт. Вам нужно что-то большее, как bet[index].Amount (или независимо от того, какое свойство вы используете).

+0

Спасибо Тиму (за то, что он так терпелив), и за ответ на этот вопрос и за то, что он так полезен. На другой вопрос тоже ответили! Есть причина, по которой мой код так смешался. Мне пришлось недавно добавить много к уже работающему моему проекту, и он начал запутываться. – eightonrose

+0

Итак, скажем, я хотел бы сослаться на это: public static Bet EmptyBet { get { { return new Bet() {amount = 0, fish = 0, better = this}; } } Как я могу ссылаться на эту функцию в другом классе? Я не могу делать «Bet.EmptyBet();» потому что вы не можете просто вызвать такие функции. Итак, как я могу «вызвать» эту функцию? – eightonrose

+0

См. Мое последнее редактирование. Похоже, вы пытаетесь создать статическое свойство или метод, который возвращает пустой, но инициализированный экземпляр ставки. Верный? –

0

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

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

Это имеет значение, если они являются государственными или частными? или это даже не о чем беспокоиться на данный момент? – eightonrose

+0

Вы имеете в виду Desciption? конечно, у вас должно быть достаточно Модификаторов доступа здесь, но это не сделает вашу ошибку «Ошибка 9». Предполагалось, что доступ к собственности через get, set или публичный член Bet (предположительно класс) – pinichi

0

Для ошибки 1 проблема в том, что вы не указали тип «i». Измените это на:

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

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

+0

спасибо! это помогло исправить эту ошибку! (и многие другие) – eightonrose

0

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

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

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

+0

Спасибо! однако это добавило одну новую ошибку. – eightonrose

Смежные вопросы