2012-06-05 2 views
5

У меня есть метод, который возвращает объект, а также имеет параметр out. Метод вызывает другой метод, который принимает тот же параметр, что и другой параметр. Это дает ошибку сборки на оператора возврата:Как назначить параметр в функции?

Выездное параметр «param1» должен быть назначен до того контрольных листьев текущий метод

код выглядит следующим образом:

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

param2 управляется в SubMethod(), а не в Method1(). Есть что-то еще, что мне нужно сделать?

+5

Этот код не согласен с сообщением об ошибке. Попытайтесь изолировать его * просто * кодом с параметром param1 (я думаю, что param2 является красной селедкой здесь). –

+0

Да, это то, что я тоже думаю. –

+2

Какова связь между TypeA и TypeB? –

ответ

3

В этом случае, я буду присвоить значение «по умолчанию». Независимо от bool, int, myFoo и т. Д. - задайте значение по умолчанию.

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 
} 

Но вам нужно определить, почему исключение относится к «param1», когда param1 явно не по вине в этом примере (разъяснений: предполагая TypeB : TypeA и должным образом ограничены).

Я считаю, что передача param2 в качестве параметра out в SubMethod(...) снимает обязательство назначить param2. Однако вы ничего не назначили param1. Здесь больше не происходит, что не объяснено?

+1

Я думаю, вы прибили его на голову. Проблема в том, что он возвращает TypeB, когда требует TypeA. –

+1

Я думаю, что просто назначение в начале - это то, с чем мне осталось. Есть и другие вещи (условные обозначения), которые могут создавать кодовые пути для SubMethod(), которые не выполняются. – 4thSpace

+1

Как я уже сказал в комментарии к вопросу, будьте осторожны, чтобы не назначать 'param2 = false;', если вы не согласитесь, что 'Method1' может вернуться с параметром param2, установленным для этого значения. «False» имеет смысл как приемлемое значение, если «SubMethod» никогда не попадает?Если компилятор может видеть, что каждый путь кода проходит через вызов 'SubMethod (out param2)', сначала не нужно устанавливать 'param2' какое-то бессмысленное значение. ('param2' определенно назначается после возвращения SubMethod'.) –

1

Вы можете установить его в false в самом начале Method1.

+1

Как немного объяснений? –

0

Могу ли я предложить перемещение из параметра в SubMethod к типу возвращаемого:

public TypeA Method1(TypeB param1, out bool param2) 
{ 
    /... some logic here .../ 
    param2 = SubMethod(param2); 
    /... some logic here .../ 
    return param1; 
} 
Смежные вопросы