Rzutowanie klasy na typ szablonowy

0

Witam, mam pytanie czy w C# jest możliwa konstrukcja taka jak poniżej:


public T Foo<T>()
{
TypKlasy obiekt;

return (T)obiekt; //rzutowanie, niestety blad
}

Bo niestety nie przechodzi to przez kompilator który zwraca błąd: Cannot implicitly convert type 'TypKlasy' to 'T'. Zastanawiam się czy jest jakiś sposób na to żeby to działało?

1

Nie do końca potrafie sobie wyobrazić praktyczne zastosowanie tego ;) Oświecisz mnie? ;-P

Zrób tak:

        public T Foo<T>()
        {
            Bar obiekt = new Bar();

            object o = obiekt;

            return (T)o; //rzutowanie, niestety blad
        }

edit: to "= new Bar();" jest niestety konieczne, bo nie możesz użyć niezainicjowanej zmiennej lokalnej.

0
 public T Foo<T>() where T: TypKlasy {
            TypKlasy obiekt=new TypKlasy();

            return (T)obiekt;
        }
1

Tak, ale założyłem że knuje coś bardziej złożonego...

Równoważny do twojego kod to:

public TypKlasy Foo()
        {
            return new TypKlasy();
        }

Albo jeszcze lepiej:
new TypKlasy();

Edit: Może jeśli T będzie dziedziczyć po TypKlasy... Tylko że wtedy będzie InvalidCastException...

0
MSM napisał(a)

Nie do końca potrafie sobie wyobrazić praktyczne zastosowanie tego ;) Oświecisz mnie? ;-P

Tak, otóż właśnie pomyślałem że zrobię coś na wzór menadżera zasobów jako singletona, który po podaniu nazwy wczytuje dany rodzaj zasobu ktory moze byc zarowno tekstura jak i dzwiekiem. Chcialem do tego zrobic jedną funkcje szablonowa, która w przypadku kiedy dany zasób nie zostanie znaleziony zwraca np. teksturę zastępcza w postaci "szachownicy".

0

To się kompiluje:

            public static T Foo<T>() where T:new()
            {
                object obj = new T(); // no cokolwiek, ale musi się
                                      // przecież DAĆ rzutować na <T>.
                return (T)obj;
            }

A twój błąd wynika z tego, że nie można sobie byle czego rzutować na T, które przecież nie wiadomo czym jest. Ani kompilator, ani runtime nie dopuści do rzutowania np. Double na Buttona.

0

A twój błąd wynika z tego, że nie można sobie byle czego rzutować na T, które przecież nie wiadomo czym jest. Ani kompilator, ani runtime nie dopuści do rzutowania np. Double na Buttona.

Kompilator pozwala jednak zawsze zrobić tak:

public T Foo<T>()  {
            object obiekt=new TypKlasy();

            return (T)obiekt;
        }

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