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? :)
@Wextor: hmm, sprawdzę :) W każdym razie, ciekawi mnie, czy to "as" ma jakieś zastosowanie, że mogę prosić o znalezienie jakiegoś obiektu, ale zdefiniować go inaczej?
@Szmerg: Wynika to z tego że typeof(MójTypik) zwraca instancję typu System.Type reprezentującą twój typ ale robi to dopiero w czasie działania programu. Mechanizm wnioskowania typów nie jest w stanie na tej podstawie wywnioskować konkretnego typu zwracanego funkcji. Gdybyś miał ten typ podany jako parametr generyczny to zadziałałoby. Zwracany jest zapewne System.Object który castujesz sobie z użyciem 'as'.
@Szmerg: Nie znam Unity ale sprawdź czy nie ma metody GameObject.FindObjectOfType(). Np w Autofac są metody przyjmujące System.Type (zwracają one System.Object) i są też generyczne zwracające podany typ.
@Szmerg: teoretycznie nie musisz uzywac as. Mozesz traktowac zwrocony obiekt jako Object aczkolwiek jesli chcesz uzyc wlasciwosci konkretnego obiektu cosTam to musisz go zrzutowac na dany typ i sprawdzic czy rzutowanie uzywajac as sie powiodlo.
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
@Szmerg: GetComponent to metoda generyczna, musisz wtedy podać typ. Sygnatura tej metody to mniej więcej: T GetComponent() . W ciele tej metody wykonywana jest logika dla której niezbędne jest podanie w parametrze generycznym T, typu jaki chcesz mieć zwrócony. Generalnie to C# jest językiem TypeSafe i nie będzie ci
Już widzę jak lewica przejmie resort edukacji, ja, jako nauczyciel, będę musiał przynosić banana do szkoły i uczyć dzieci zakładania kondomów. "Dzisiaj drogie dzieci będziemy uczyć się zakładać prezerwatywy, a tego banana przyniosłem, bo nie staje mi na głodnego".
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;
@Szmerg: to zwraca Object, a nie cosTam. Nawet jak wpisujesz typeof(cosTam)
Mechanizm wnioskowania typów nie jest w stanie na tej podstawie wywnioskować konkretnego typu zwracanego funkcji. Gdybyś miał ten typ podany jako parametr generyczny to zadziałałoby.
Zwracany jest zapewne System.Object który castujesz sobie z użyciem 'as'.
Funkcja FindObjectOfType() zwraca obiekt typu
Object
dlatego rzutowanie przy uzyciuAS
jest potrzebne.@3THU5_9r3W: chyba pomyliłeś z
costam.GetType()
, typeof jest ewaluowane przy kompilacjiKomentarz usunięty przez moderatora
as
. Mozesz traktowac zwrocony obiekt jakoObject
aczkolwiek jesli chcesz uzyc wlasciwosci konkretnego obiektucosTam
to musisz go zrzutowac na dany typ i sprawdzic czy rzutowanie uzywajacas
sie powiodlo.@Szmerg: GetComponent to metoda generyczna, musisz wtedy podać typ. Sygnatura tej metody to mniej więcej: T GetComponent() . W ciele tej metody wykonywana jest logika dla której niezbędne jest podanie w parametrze generycznym T, typu jaki chcesz mieć zwrócony. Generalnie to C# jest językiem TypeSafe i nie będzie ci