Użycie pola do deklaracji tablicy - jak zedeklarować tablicę o rozmiarze ustalanym dynamicznie?

0

Witam.

Oto stwarzający problemy kod:

namespace Warcaby
{
    class user : gracz
    {
        private char[,] plansza = new char[8,8];
        int i = 4;
        int[] tab = new int[user.i];
     }
}

Nie działa mi to w ogóle, bo wyskakuje błąd że " A field initializer cannot reference the non-static field, method, or property 'Warcaby.user.i". Jak wpiszę samo i lub Warcaby.user.i to też nie działa.

Zrozumiałem, że nie można za pomocą pola w obiekcie deklarować tablicy, ale jak w takim razie zedeklarować tablicę o rozmiarze ustalanym dynamicznie w C#? Albo co zrobić w przypadku gdy chcę wszystkie tablice w danym obiekcie zadeklarować o rozmiarze równym zadeklarowanej wcześniej w programie?
A to z kolei działa już normalnie:

namespace Proba
{
    class Program
    {
       private void print()
       {
       
       }

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
            int i = 4;
            int[] tab = new int[i];
            Console.WriteLine(tab[3]);


        }
    }
}

O co tutaj chodzi?

0

Nie możesz w inicjalizacji tego typu odwoływać się do innego pola/metody/właściwości, która nie jest statyczna.

Aby rozwiązać twój problem, stwórz konstruktor swojej klasy i w nim dopiero nadawaj wartości elementom twojej klasy. Tam będziesz już się mógł odwołać do wcześniej utworzonych wartości.

0

A field initializer cannot reference the non-static field, method, or property 'Warcaby.user.i"

Inicjalizator pola nie może odwoływać się do niestatycznego pola, metody albo własciwości 'Warcaby.user.i'.

Przenieś inicjalizację do konstruktora.

0

No dobra, ale dlaczego drugi przykład działa? Rozumiem, iż to dlatego, iż metoda main jest domyślnie statyczna, czy mam rację?

2

W pierwszym przypadku nie istnieje coś takiego, jak user.i, ponieważ można odwoływać się tak tylko do stałych oraz zmiennych statycznych - zauważ, że user to klasa. Jeśli user byłby obiektem, tj. instancją klasy np. User, to mógłbyś zrobić takie odwołanie. Mógłbyś też zrobić takie odwołanie, gdyby i było stałą lub zmienną statyczną - o tym za chwilę.
W przykładzie numer dwa działa to, ponieważ odwołujesz się do lokalnej zmiennej (i), która faktycznie jest lokalną zmienną. Ponadto masz tutaj zdefiniowaną kolejność operacji - przy tworzeniu tablicy wiadomo, że linijka wcześniej się wykonała, a więc że i ma wartość taką, jakiej oczekujesz, czyli 4. W pierwszym przypadku nie widać, czy jako pierwsza zainicjalizuje się tablica (wtedy wartość i wyniesie 0 i taka będzie długość tablicy), czy i (wtedy będziesz mieć oczekiwane cztery elementy tablicy).

Odwołanie User.Pole jest możliwe, gdy

  • User to klasa, a Pole to zmienna statyczna (protected, jeśli odwołujesz się z dziedziczącej po User klasy, internal, jeśli odwołujesz się z innej klasy, public jeśli odwołujesz się z klasy z innego projektu (niezaprzyjaźnionego));
  • User to klasa, a Pole to stała (protected/internal/public jw.);
  • User to obiekt, a Pole to zmienna niestatyczna lub niestatyczny getter, ewentualnie w specyficznych przypadkach inny element (protected/internal/public jw.);

Ponieważ to, o co pytasz to absolutne podstawy programowania obiektowego, to polecam przed zadaniem kolejnych pytań o zapoznanie się z jakimś tutorialem o tym temacie.

0

Rozumiem już o co chodzi. Dziękuję za klarowną odpowiedź :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1