C# szablon klasy

0

Witam, pisze program do sortowania tablic i ogólnie testów z tym związanych. Potrzebuję aby moja klasa odpowiadająca za testy była szablonem (tak aby testy możliwe były dla tablic wypełnionych int, float etc). Nie mogę sobie poradzić z wypełnianiem tablicy zgodnie z oczekiwanym typem, przy próbie wypełnienia tablicy wyrzuca błąd:

Cannot convert type 'int' to 'T'

Oto część kodu:

 
class TestySortowan<T>
    {
        /***********zmienne*******************/
        private T[] tablica;        

        /***********metody*******************/
        //Konstruktor
        public TestySortowan(int n)
        {
            tablica = new T[n];
        }

        /*Wypelnia tablice liczbami w zaleznosci od prarametru
         *  0 - nieposortowana
         *  -100 - posortowana odwrotnie 
         */
        private void przygotujTablice(int procentPosortowanych)
        {
            
            if (procentPosortowanych == 0)
            {
                Random rand = new Random();
                for (int i = 0; i < tablica.Count(); i++)
                {

                    tablica[i] = (T)rand.Next(100); // Błąd
                    
                }

            }
            else
            {
                sortuj(procentPosortowanych);
            }

        }
     }

Czy jest ktoś w stanie wytłumaczyć jak to zrobić by działało poprawnie, według mojego toku myślenia jest poprawnie jednak widocznie czegoś nie rozumiem. Byłbym bardzo wdzięczny za pomoc ponieważ nie mogę nigdzie odnaleźć odpowiedzi na mój problem.

0

Wypelnia tablice liczbami w zaleznosci od prarametru

A skąd kompilator ma wiedzieć, że można rzutować int na T? Musiałbyś chyba dostarczyć dane z zewnątrz

0

możesz zrobić coś w stylu class TestySortowan<T> where T is ... i dać jakiś interfejs albo bazowy typ

0

@kisiel_665, po co pole tablica jest generyczne, skoro i tak wstawiasz tam int? Chyba sam sobie stworzyłeś problem. :)

0

Chciałbym wylosować floata i zrzutować na typ podany przy tworzeniu klasy. Obecne rozwiązanie jest chwilowe, nie chce pisać całego kodu jeśli na wstępie moje założenia się nie sprawdziły.

0
kisiel_665 napisał(a):

Chciałbym wylosować floata i zrzutować na typ podany przy tworzeniu klasy.

No dobra, ale w jakim celu?
Wynik losowania jest liczbą, więc Twoje T mogłoby być tylko typem reprezentującym liczbę. Prawdopodobnie lepiej byłoby, gdybyś zamiast generyków użył oddzielnych metod (albo nawet klas) dla różnych typów liczbowych.

0
somekind napisał(a):
kisiel_665 napisał(a):

Chciałbym wylosować floata i zrzutować na typ podany przy tworzeniu klasy.

No dobra, ale w jakim celu?
Wynik losowania jest liczbą, więc Twoje T mogłoby być tylko typem reprezentującym liczbę. Prawdopodobnie lepiej byłoby, gdybyś zamiast generyków użył oddzielnych metod (albo nawet klas) dla różnych typów liczbowych.

A gdyby chciał stringa, inta i swoje własne objekty klasy posortować jedną metodą ? Chyba po to właśnie są <T> ?

0
wedlock napisał(a):

A gdyby chciał stringa, inta i swoje własne objekty klasy posortować jedną metodą ? Chyba po to właśnie są <T> ?

No niby tak, ale on tam ma: tablica[i] = (T)rand.Next(100);, czyli chyba chce przypisać do T wynik losowania liczby. Niby można to także do stringa przypisać, ale co z innymi klasami? :)

2

Generalnie koledzy chcą ci powiedzieć że <T> może być każdym możliwym występującym typem a jak wiadomo Int-a bo to zwraca ci random nie da się rzutować na wszystkie możliwe typy. I to dokładnie mówi ci błąd kompilatora "Cannot convert type 'int' to 'T'". Ale int-można z rzutować na object a object na każdy możliwy typ przynajmniej według kompilatora potem jest w twojej kwestii żeby nie rzutować tego np. na stringa tzn nie tworzyć klasy TestySortowan<string> i potem wywołać te metode bo wywali exeption.
ale dla kompilatora forma tablica[i] = (T)(object)rand.Next(100); jest jak najbardziej poprawna:).
Pozdrawiam.

0

Dzięki wielkie stanley21 za wyczerpujące i trafne wyjaśnienie. Zrozumiałem gdzie jest błąd w moim toku myślenia, więc jeszcze raz dziękuje za wytłumaczenie.

P.S to że muszę wykorzystać typ generyczny to nie jest moja własna nieprzymuszona decyzja ;]

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