2014-11-30 1 views
1

Я новичок программист и изучаю на данный момент C# и Unity3d.инициализация массива C# «не может ссылаться на нестатические поля, метод или свойство» error

У меня возникла проблема, так как я попытался инициализировать массив переменных public float.

[Range (0,1)] 
public float appleProbability = 0.4f ; 

[Range (0,1)] 
public float fishProbability = 0.2f ; 

[Range (0,1)] 
public float cheeseProbability = 0.10f ; 

[Range (0,1)] 
public float poopProbability = 0.14f ; 

[Range (0,1)] 
public float bombProbability = 0.14f ; 

[Range (0,1)] 
public float starProbability = 0.02f ; 

private float[] probs = new float[] {appleProbability, fishProbability, cheeseProbability, poopProbability, bombProbability, starProbability}; 

(код [Range (0,1)] должен сделать ползунок в инспекторе сценария в единстве, так что вы можете манипулировать общественным переменную между 0 и 1 с помощью ползунка.)

Я получаю ошибку: «Инициализатор поля не может ссылаться на нестатические поля, метод или свойство« GameManager.appleProbability ».» (То же самое для других переменных)

Я попробовал этот код для теста:

public int blub = 1; 
public int hub = 2; 

private int[] bla = new int[3]; 

bla[0] = blub; 

, но я получаю сообщение об ошибке: «размер массива не может быть указан в объявлении переменной (попытка инициализации с ' новое выражение ").

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

Я прочитал этот вопрос all possible c# array initialization syntaxes , но это не поможет.

Я чувствую себя немного глупо, но я не получаю ошибку:/

ответ

1

вы пытаетесь установить значение в массив, если эти значения не были инициализированы, вы необходимо либо сделать эти значения статическими, либо жесткими по умолчанию в массиве, либо инициализировать эти значения в конструкторе:

[Range (0,1)] 
public static float appleProbability = 0.4f ; 
[Range (0,1)] 
public static float fishProbability = 0.2f ; 
[Range (0,1)] 
public static float cheeseProbability = 0.10f ; 
[Range (0,1)] 
public static float poopProbability = 0.14f ; 
[Range (0,1)] 
public static float bombProbability = 0.14f ; 
[Range (0,1)] 
public static float starProbability = 0.02f ; 
private float[] probs = new float[] { 
         appleProbability, 
         fishProbability, 
         cheeseProbability, 
         poopProbability, 
         bombProbability, 
         starProbability}; 

ИЛИ:

[Range (0,1)] 
public float appleProbability = 0.4f ; 
[Range (0,1)] 
public float fishProbability = 0.2f ; 
[Range (0,1)] 
public float cheeseProbability = 0.10f ; 
[Range (0,1)] 
public float poopProbability = 0.14f ; 
[Range (0,1)] 
public float bombProbability = 0.14f ; 
[Range (0,1)] 
public float starProbability = 0.02f ; 
private float[] probs = new float[] { 
         .4f, 
         .2f, 
         .10f, 
         .14f, 
         .14f, 
         .02f}; 

ИЛИ:

[Range (0,1)] 
public float appleProbability = 0.4f ; 
[Range (0,1)] 
public float fishProbability = 0.2f ; 
[Range (0,1)] 
public float cheeseProbability = 0.10f ; 
[Range (0,1)] 
public float poopProbability = 0.14f ; 
[Range (0,1)] 
public float bombProbability = 0.14f ; 
[Range (0,1)] 
public float starProbability = 0.02f ; 
private float[] probs; 
MyClass() 
{ 
    probs = new float[] { 
         appleProbability, 
         fishProbability, 
         cheeseProbability, 
         poopProbability, 
         bombProbability, 
         starProbability}; 
} 

Вы можете также сделать их const вместо статического, если они не собираются менять.

1

Компиляция говорит вам именно то, что происходит - вы не можете ссылаться на не-статические поля в инициализаторе массива.

У вас есть два варианта решения этой проблемы:

  • Если это нормально с вами, чтобы сделать вероятности static, сделать их static или даже const не они предназначены только для чтения.
  • В противном случае переместите инициализацию в конструктор вашего класса.

Вот первый вариант:

[Range (0,1)] 
public static float fishProbability = 0.2f; 
... 

Вот второй вариант:

private float[] probs; 
public MyClassConstructor() { 
    probs = new float[] {appleProbability, fishProbability, cheeseProbability, poopProbability, bombProbability, starProbability}; 
} 
+0

Большое спасибо! Поэтому я могу использовать только статическое решение, если мой класс наследует от MonoBehaviour, потому что Unity не любит конструкторы. Я знаю, что такое статический метод или статический класс, но я не видел его в массивах, поэтому я был в замешательстве. –

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

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