Я пытаюсь понять, почему у компилятора проблема с этой функцией. Это дает мне ошибку «Не все пути кода возвращают значение», однако я не вижу ситуации, когда поток управления переходит к выражению if( a )
без истинности a
(поэтому if( a )
является излишним, но компилятор, похоже, не признать это).
public static Boolean Foo(Boolean x)
{
Boolean a = false;
if( x )
{
a = true;
}
else
{
try
{
SomethingThatMightThrow();
Assert.IsFalse( a );
return a;
}
catch(Exception)
{
a = true;
}
}
if( a )
{
return x;
}
}
Немедленное исправление состоит в том, чтобы просто полностью удалить оператор защиты if( a )
и немедленно return x
, но почему компилятор жалуется, даже если он должен быть в состоянии статически доказать, что все возможные пути кода попадут в оператор return
? Важно отметить, что нет петель, которые часто являются основной причиной невозможности доказать return
-ность.
Я использую VS2015 Update 3.
printUsage
никогда не будет ложным к концу функцииMain
- если это когда-либо будетfalse
, то последует операторreturn
внутриtry{}
. - person Dai   schedule 21.01.2017printUsage
станет ложным, когда вы его проверите? - person Martin Verjans   schedule 21.01.2017return
. Но мой вопрос заключается в том, почему компилятору не удается статически доказать правильность моего методаMain
. Я знаю, что текущая структура кода неоптимальна, но она по-прежнему верна. - person Dai   schedule 21.01.2017a
всегдаtrue
, почему бы вообще не удалитьif
? - person Niyoko   schedule 21.01.2017