2013-08-05 3 views
0

Почему этот код части не работает и отображается сообщение «невозможно получить доступ, если ссылка экземпляра квалифицирует его вместо имени типа»? Пожалуйста, объясните мне.Понимание классов?

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    {   
     public Form1() 
     { 
     } 

     public class Report //my public class 
     { 
      public static double[] KwotaZ = new double[10]; 
      public static double[] KwotaNa = new double[10]; 
      public static string[] WalutaNa = new string[10]; 
      public static string[] WalutaZ = new string[10]; 
      public static int IlOperacji = 0; 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      Report raport2 = new Report(); //create new object class Report 
      raport2.KwotaZ[raport2.IlOperacji] = 213.3; //this wrong part code why??? 
      Konwerter(); 
     } 
    } 
} 
+0

Отчет является статическим классом, в то время как button1_Click является нестационарным методом – zsong

+5

Поскольку 'KwotaZ' является статическим. Если эти массивы должны существовать в каждом новом объекте, они не должны быть статическими. – Joe

+0

Вы указали статическое поле (например) 'IlOperacji' по имени экземпляра. –

ответ

5

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

Таким образом, вы должны использовать либо статически, как так

Report.KwotaZ[Report.IlOperacji] = 213.3; 

или определить их как переменные экземпляра, как так (без static ключевого слова)

public double[] KwotaZ = new double[10]; 
public int IlOperacji = 0; 
+0

Хорошо, я определяю их как переменные экземпляра без статического ключевого слова, но появляются новые проблемы. Второй частичный класс (Form4) имеет другую проблему, когда я хочу назначить form1.report2.KwotaZ [0] .ToString(); – Gugunion

+0

Второй класс: Публичный частичный класс Форма4: Форма { частная форма1 форма1; public Form4 (Form1 form1) { InitializeComponent(); this.form1 = form1; } частная пустота Form4_Load (объект отправителя, EventArgs е) { для (INT I = 0; я Gugunion

+0

@Gugunion Если у вас есть другой вопрос, вы должны задать другой вопрос. –

2

KwotaZ и IlOperacji являются static поля, поэтому синтаксис для доступа к ним не является instance.fieldName - это TypeName.fieldName, как в

Report.KwotaZ[Report.IlOperacji] = 213.3; 

Это позволит программе скомпилировать, но это, вероятно, не то, что вы хотите. Это гораздо более вероятно, что вы должны сделать static поля в свойство экземпляра:

public class Report //my public class 
{ 
    // Only showing two properties here; do the rest in the same manner 
    public double[] KwotaZ { get; set; } 
    public double[] KwotaNa = { get; set; } 

    public Report() 
    { 
     this.KwotaZ = new double[10]; 
     this.KwotaNa = new double[10]; 
    } 
} 
1

Проблемы с «статическим» ключевым словом в своем классе «Отчет». «static» означает, что имеется только одна копия переменной. Например, даже если вы создадите 5 экземпляров класса «Отчет», все они будут иметь одинаковое значение для «KwotaZ».

Возможно, вы захотите удалить «статическое» ключевое слово. Таким образом, каждый экземпляр «Отчет» будет иметь свою собственную версию переменных.

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