2012-03-18 2 views
0

Я только начинаю с C#, и я застрял в этой проблеме в течение двух недель. У меня есть основная форма, которая получает значения из класса и подкласса. Моя проблема в том, что когда я пытаюсь создать объект CorporateClass VB, мне говорят, что две из моих переменных (CarSizeInteger и DiscountInteger) не назначены. Мой вопрос - почему. Я реализовал их раньше в программе. Помогите! Я безнадежно застрял!C# Visual Basic Inheritance

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 


namespace EX02_CarRentals 
{ 
    public partial class RentalForm : Form 
    { 
     public RentalForm() 
     { 
      InitializeComponent(); 
     } 

     private void CloseButton_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 

     private void CalculateButton_Click(object sender, EventArgs e) 
     { 
      int DaysInteger, BeginningOdometerInteger, EndingOdometerInteger, CarSizeInteger, DiscountInteger; 

      if (LicenseTextBox.Text != "") 

       if (CompactRadioButton.Checked || MidSizeRadioButton.Checked || LuxuryRadioButton.Checked) 
       { 
        int.TryParse(DaysRentedTextBox.Text, out DaysInteger); 

        int.TryParse(BeginningOdometerTextBox.Text, out BeginningOdometerInteger); 

        if (BeginningOdometerInteger > 0) 
        { 
         int.TryParse(EndingOdometerTextBox.Text, out EndingOdometerInteger); 
         if (EndingOdometerInteger > 0) 
         { 
          if (CompactRadioButton.Checked) 
           CarSizeInteger = (int)CarSize.Compact; 

          else if (MidSizeRadioButton.Checked) 
           CarSizeInteger = (int)CarSize.MidSize; 

          else CarSizeInteger = (int)CarSize.Luxury; 
         } 
         { 
          if (CorporateRadioButton.Checked || InsuranceRadioButton.Checked) 
          { 
           if (CorporateRadioButton.Checked) 
            DiscountInteger = (int)Discount.Corporate; 

           else if (InsuranceRadioButton.Checked) 
            DiscountInteger = (int)Discount.Insurance; 

           //create an instance of the Corporate Class 
           CorporateClass aCorpRental = new CorporateClass(BeginningOdometerInteger, EndingOdometerInteger, CarSizeInteger, DaysInteger, DiscountInteger); 
           AmountDueTextBox.Text = (aCorpRental.getAmountDue()).ToString("C"); 
          } 
          else 
          { 
           //create an instance of the Rental Class 

           RentalRate ARental = new RentalRate(BeginningOdometerInteger, EndingOdometerInteger, CarSizeInteger, DaysInteger); 
           AmountDueTextBox.Text = (ARental.getAmountDue()).ToString("C"); 
          } 
         } 
        } 
       } 
      } 
     } 

     private void DaysRentedTextBox_TextChanged(object sender, EventArgs e) 
     { 

     } 

    } 
} 
+2

Я умираю, чтобы понять, почему вы решили оставить свой код все испорченным, как это было приемлемо? – ChaosPandion

+0

На самом деле мало смысла суффикса «Integer» для переменных int. – IanNorton

+0

FYI, в C# идиоматично назвать локальные переменные, начиная с нижнего регистра. Ни в C#, ни в VB не рекомендуется указывать переменные с их типом; имя переменной должно описывать ее * цель *, а не ее память. –

ответ

7

В C#, вы не можете использовать значение переменной прежде, чем это дано значение, или вы получите неприсвоенное переменную ошибку. Давайте посмотрим, почему ваш код дает вам это.

Я сосредоточусь на CarSizeInteger. Есть три места, где вы пытаетесь инициализировать CarSizeInteger:

if (EndingOdometerInteger > 0) 
{ 
    if (CompactRadioButton.Checked) 
     CarSizeInteger = (int)CarSize.Compact; 
    else if (MidSizeRadioButton.Checked) 
     CarSizeInteger = (int)CarSize.MidSize; 
    else CarSizeInteger = (int)CarSize.Luxury; 
} 

Обратите внимание, что все три из этой уступки содержится в if (EndingOdometerInteger > 0) блоке. В случае, если EndingOdometerInteger > 0 является ложным, нет присвоений. Таким образом, когда вы пытаетесь использовать CarSizeInteger позже, компилятор обнаруживает, что возможно, что CarSizeInteger неинициализирован, что является ошибкой.

Чтобы избежать этой ошибки, вы можете дать CarSizeInteger значение по умолчанию:

int CarSizeInteger = 0; 

или добавить блок еще в вашей, если заявление, которое инициализирует CarSizeInteger:

if (EndingOdometerInteger > 0) 
{ 
    // ... 
} 
else 
{ 
    CarSizeInteger = 0; 
} 

В любом случае, просто сделать убедитесь, что каждой из ваших переменных задано значение, прежде чем вы попытаетесь прочитать его значение.