criggidycroo Ответов: 3

C# - как бы я назначил эту переменную?


Мой код таков:
public class PublicPrivate : MonoBehaviour {

	public float level = 10f;      
	float health = level * 10f;  

	void Update () {
		if (health <= 0) {
			Debug.Log ("You have died.");
		}
	}

Однако, когда я отлаживаю, он говорит мне:
    public float level = 10f; 
	float health = level * 10f;
A field initialiser cannot reference the non-static field, method, or property 'PublicPrivate.level' 

Я понимаю почему, но Я не могу понять, на что мне следует изменить переменную "здоровье" так как float или int не будут работать. Есть идеи? В настоящее время изучаю C#, поэтому, пожалуйста, простите меня, если на этот вопрос есть очевидный ответ.

Что я уже пробовал:

Я пробовал изменить его на int и double, но ни то, ни другое не сработало. Не слишком уверен, что еще можно попробовать.

3 Ответов

Рейтинг:
6

Ehsan Sajjad

Это потому что :

Вы не можете использовать переменную экземпляра для инициализации другой переменной экземпляра. Почему? Поскольку компилятор может переставить их-нет никакой гарантии, что напоминание будет инициализировано до defaultReminder, поэтому вышеприведенная строка может вызвать исключение NullReferenceException.


Вы можете прочитать более подробную информацию о нем по этой ссылке

одним из решений является перемещение инициализации второй переменной в конструктор или инициализация обеих переменных, например:

public class PublicPrivate : MonoBehaviour {
 
	public float level;      
	float health;

        public PublicPrivate()
        {
           level = 10f;
           health = level * 10f;
        }  
 
	void Update () {
		if (health <= 0) {
			Debug.Log ("You have died.");
		}
	}


вы также можете обратиться к этот вопрос


Рейтинг:
18

Midi_Mick

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


Рейтинг:
0

Matt T Heffron

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

public class PublicPrivate : MonoBehaviour {
  const float defaultLevel = 10f;
  public float level = defaultLevel;
  float health = defaultLevel * 10f;

Вы могли бы даже сделать лучше, избавившись от как можно большего количества встроенных констант в пользу четко названной константы, и иметь:
public class PublicPrivate : MonoBehaviour {
  const float defaultLevel = 10f;
  public float level = defaultLevel;
  const float levelToHealthFactor = 10f;
  float health = defaultLevel * levelToHealthFactor;