Wpis z mikrobloga

Ktoś mi łaskawie wytłumaczy

a = GetComponent ();
a = GameObject.FindObjectOfType(typeof(cosTam)) as cosTam;

Dlaczego w Unity, C#, wymagane jest dopowiedzenie jeszcze, że poszukiwanym obiektem jest np. CosTam jako (as) coś tam? Dlaczego muszę doprecyzowywać po "as" jeszcze to, skoro już wcześniej wyraziłem się, że typeoff to jest właśnie cosTam? :)

#unity3d #unity #unity #gamedev #csharp

Dziękuję za odpowiedź.

EDIT: i dlaczego musze jeszcze powiedzieć że a to weź komponent od skoro już na dzień dobry stwierdziłem/zdefniowałem sobie, że
cosTam a;
  • 28
  • Odpowiedz
@Szmerg: Za mało bo nie ma związku z metodą, możesz mieć szereg połączonych metod generycznych i metod generycznych przyjmujących kilka parametrów generycznych i jak byś stwierdził do której metody i do którego parametru ma być wykorzystany akurat twój wcześniej zdefiniowany typ?( np. cosTam a = MetodaA().MetodaB(), gdzie ma być wykorzystane twoje cosTam? ). Możesz za to trochę to odwrócić do góry nogami używając słówka kluczowego 'var'. wystarczy wtedy że podczas
  • Odpowiedz
no tak, ale dlaczego jeszcze muszę pisać "as" i nazwę obiektu? Dlatego, bo jest głupio napisane?


Popatrz na to tak: twoja metoda przyjmuje argument typu Type. Ten Type jest w zasadzie takim samym typem zmiennej jak choćby string, int czy twoje cosTam. Zmienna typu Type przechowuje informację o dowolnym typie (trochę taka incepcja), czyli może np. zawierać informację o intach, o stringach czy czymkolwiek innym, ale sama zawsze pozostaje zmienną typu Type.

Kompilator nie próbuje się domyślić zawartości tego argumentu w metodzie, bo parametry zostaną przekazane do niej dopiero w trakcie działania programu, nawet jeśli wykorzystałeś operator typeof do zdefiniowania sobie typu na zewnątrz.
Z kolei w metodach generycznych (te z takimi dodatkowymi nawiasami: ) niezależnie od tego z jakimi danymi je wywołasz, parametr T musi być znany już w momencie kompilacji. Technicznie dla każdego takiego typu tworzona jest pod spodem oddzielna metoda. Musisz sobie poczytać o kowariancji i kontrawariancji.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 1
@Tarec: Bardzo słusznie, dzięki za wyczerpujący opis. Nie wziąłem pod uwagę typów nieznanych podczas kompilacji (zmyliło mnie użycie typeof, bo tutaj bezdyskusyjnie lepiej użyc wersji generycznej). I święta prawda, że wykop to kiepskie miejsce na to, przez ludzi mego pokroju, na stacku taka odp szybko byłaby zaminusowana.
  • Odpowiedz