0

Я изучаю C# и Unity, возник вопрос.

Предположим мы создаем пустой массив с фиксированным объемом. Затем присваиваем значение элементу массива.
Вопрос: Почему присвоение некорректно сделать вне метода Start?

То есть почему так правильно:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChaikaLetit : MonoBehaviour {

    string[] names = new string[5];

    // Use this for initialization
    void Start () {
        names [0] = "Jessie";
        print ("First name is "+names[0]);
    }
}

А так нет:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChaikaLetit : MonoBehaviour {

    string[] names = new string[5];
    names [0] = "Jessie";

    // Use this for initialization
    void Start () {
        print ("First name is "+names[0]);
    }
}

Заранее большое спасибо!

Grundy
  • 81,538
Rumata
  • 1,075
  • 2
    потому что это ошибка синтаксиса C#. Использовать поля можно только внутри методов свойств или конструкторов. Кстати был уже подобный вопрос, надо поискать – Grundy Jan 27 '17 at 09:50
  • 2
    Вопрос никак не относится к Юнити. Поэтому я бы вам рекомендовал для начала изучить C# – Алексей Шиманский Jan 27 '17 at 09:52
  • @Grundy Но при этом если мы задаем значения элементов сразу во время создания массива string[] names = new string[]{"Jessie"}; это не считается "использованием" уже созданного поля, поэтому корректно, верно? – Rumata Jan 27 '17 at 09:54
  • @Rumata, да, это все входит в инициализацию поля – Grundy Jan 27 '17 at 09:54
  • @АлексейШиманский Не был уверен, не связано ли это именно с тем как Unity интерпретирует C#. – Rumata Jan 27 '17 at 09:56
  • @Grundy Понятно, спасибо большое! – Rumata Jan 27 '17 at 09:57
  • @Grundy Не до конца понимаю пример в другом вопросе, по-моему там речь о том как правильно объявлять классы?.. – Rumata Jan 27 '17 at 10:03
  • @Rumata, нет, там суть в том, что в книжке в примере была ошибка: в теле класса было не только объявление поля но и его использование, как у тебя в вопросе. – Grundy Jan 27 '17 at 10:06
  • @Grundy Ок, спасибо, тогда все верно. – Rumata Jan 27 '17 at 10:08

1 Answers1

2

В C# так сделать нельзя, но можно так:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChaikaLetit : MonoBehaviour {

   string[] names = new string[5]
        {
         "Jessie",
         "name 2 ",
         "name 3",
         "name 4",
         "name 5"
        };

    // Use this for initialization
    void Start () {
        print ("First name is "+names[0]);
    }
}

https://msdn.microsoft.com/uk-ua/library/0a7fscd0.aspx

Объясню не научно, но по-простому: вне функций в C# можно только объявлять и инициализировать переменные, при этом names[0] = "Jessie"; Это уже обращение к элементу массива.


Но если рассматривать Unity, то в ней не рекомендованы конструкторы, по этому массив из Unity-типов придется инициализировать либо в редакторе либо в функции Awake/Start, иначе Unity может выдать ошибку/предупреждение.

Valera Kvip
  • 2,677