2012-06-05 13 views
5

Mam metodę, która zwraca obiekt, a także ma parametr out. Metoda wywołuje inną metodę, która przyjmuje ten sam parametr wyjściowy, co inny parametr wyjściowy. To daje błąd kompilacji na instrukcji return:Jak przypisać parametr do funkcji?

się parametr „param1” musi być przypisana do przed liśćmi kontrolnymi obecna metoda

Kod wygląda następująco:

public TypeA Method1(TypeA param1, out bool param2) 
{ 
    /... some logic here .../ 
    SubMethod(out param2); 
    /... some logic here .../ 
    return param1; 
} 

param2 jest manipulowane w SubMethod(), a nie w Method1(). Czy jest coś jeszcze, co muszę zrobić?

+5

Ten kod nie zgadza się z komunikatem o błędzie. Spróbuj wyizolować go do * just * code z 'param1' (myślę, że' param2' jest tutaj czerwonym śledziem). –

+0

Tak, to też myślę. –

+2

Jaki jest związek między TypeA i TypeB? –

Odpowiedz

3

W tym przypadku, będę przypisać wartość „default”. Bez względu na bool, int, myFoo itd. - ustaw domyślną wartość.

public TypeA Method1(TypeB param1, out bool param2) 
{ 
    param2 = false; // default value; 
    // or 
    param2 = default(bool); // in cases where you are not sure what the default is 

    /... some logic here .../ 
    SubMethod(out param2); 
    /... some logic here .../ 
    return param1; // UPDATE: <- this is where you are receiving the exception 
} 

Ale trzeba ustalić, dlaczego wyjątek odnosi się do „param1” kiedy param1 wyraźnie nie ponosi winy w tym przykładzie (wyjaśnienia: zakładając TypeB : TypeA i jest właściwie ograniczona).

Wierzę, że podanie param2 jako parametru out w SubMethod(...) usuwa obowiązek przypisania param2. Jednak nie przypisałeś nic do param1. Czy jest tu więcej informacji, których nie wyjaśniono?

+1

Myślę, że przybiłeś go w głowę. Problem polega na tym, że zwraca on TypeB, gdy wymaga TypeA. –

+1

Myślę, że właśnie przypisywanie na początku to, z czym jestem. Istnieją inne rzeczy (warunkowe), które mogą tworzyć ścieżki kodu dla SubMethod(), które nie są brane. – 4thSpace

+1

Tak jak powiedziałem w komentarzu do pytania, uważaj, aby nie przypisać 'param2 = false;' chyba że zaakceptujesz, że 'Metoda1' może powrócić z parametrem' param2' ustawionym na tę wartość. Czy 'false' ma sens jako akceptowalna wartość, jeśli' SubMethod' nigdy nie zostanie trafiony?Jeśli kompilator widzi, że każda ścieżka kodowa przechodzi przez wywołanie 'SubMethod (out param2)', nie będzie konieczne uprzednie ustawienie 'param2' na jakąś bezsensowną wartość. (Parametr 'param2' jest definitywnie przypisywany po zwrocie' SubMethod'.) –

1

Można ustawić go na false na samym początku Method1.

+1

Co powiesz na małe wyjaśnienie? –

0

Mogę zaproponować przeniesienie parametru w SubMethod do zwracanego typu:

public TypeA Method1(TypeB param1, out bool param2) 
{ 
    /... some logic here .../ 
    param2 = SubMethod(param2); 
    /... some logic here .../ 
    return param1; 
} 
Powiązane problemy