Я пытаюсь понять, почему у компилятора есть проблемы с этой функцией. Это дает мне ошибку «Не все коды пути возвращают значение», однако я не вижу ситуации, когда поток управления переходит к выражению 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
-ness.
Я использую VS2015 Update 3.
Что делать, если в конце этого кода _printUsage_ является ложным? Помните, что компилятор не может догадаться, что во время выполнения ваша переменная всегда истинна, когда вы достигаете точки выхода – Steve
@Steve Но 'printUsage' никогда не будет ложным к концу функции' Main' - если это когда-либо 'false', тогда' return 'statement внутри' try {} 'будет соблюдаться. – Dai
Если переменные всегда имеют значение true, зачем использовать переменную в первую очередь? Удалите условие и всегда печатайте его, если вы еще не вернулись из метода. – knittl