2012-06-05 14 views
5

Ho un metodo che restituisce un oggetto e ha anche un parametro out. Il metodo chiama un altro metodo che accetta lo stesso parametro out di un altro parametro esterno. Questo dà un errore di generazione sulla dichiarazione di ritorno:Come assegnare un parametro nella funzione?

Il parametro 'param1' out devono essere assegnati a prima di foglie di controllo l'attuale metodo

Il codice si presenta come:

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

param2 è manipolato in SubMethod(), non in Method1(). C'è qualcos'altro che devo fare?

+5

Questo codice non è compatibile con il messaggio di errore. Cerca di isolarlo in * solo * codice con 'param1' (penso che' param2' sia una falsa pista qui). –

+0

Sì, è quello che penso anch'io. –

+2

Qual è la relazione tra TypeA e TypeB? –

risposta

3

In questo caso, io assegnare un valore 'default'. Indipendentemente da bool, int, myFoo, ecc. - imposta un valore predefinito.

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 
} 

ma è necessario individuare il motivo per cui l'eccezione si riferisce alla 'param1' quando param1 chiaramente non è in difetto in questo esempio (di chiarimento: assumendo TypeB : TypeA e sia correttamente vincolato).

Credo che passare param2 come parametro out in SubMethod(...) rimuova l'obbligo di assegnare param2. Tuttavia, non hai assegnato nulla a param1. C'è dell'altro qui che non è stato spiegato?

+1

Penso che l'hai inchiodato sulla testa. Il problema è che sta restituendo un TypeB quando richiede TypeA. –

+1

Penso che solo assegnare all'inizio sia ciò che mi rimane. Ci sono altre cose in corso (condizionali) che potrebbero creare percorsi di codice per SubMethod(), che non vengono presi. – 4thSpace

+1

Come ho detto nel commento alla domanda, fai attenzione a non assegnare 'param2 = false;' a meno che tu accetti che 'Method1' possa tornare con' param2' impostato su quel valore. 'False 'ha senso come valore accettabile se' SubMethod' non viene mai colpito?Se il compilatore può vedere che ogni percorso di codice passa attraverso la chiamata 'SubMethod (out param2)', non sarà necessario prima impostare 'param2' su qualche valore senza significato. ('param2' è definitivamente assegnato dopo il ritorno di' SubMethod'). –

1

È possibile impostarlo su false all'inizio di Method1.

+1

Com'è una spiegazione? –

0

Posso suggerire di spostare il parametro out nel Submethod al tipo di ritorno:

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