【发布时间】:2017-06-06 05:56:22
【问题描述】:
我试图弄清楚为什么编译器有这个函数的问题。它给了我“并非所有代码路径都返回值”错误,但是我看不到控制流将传递给 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 更新 3。
【问题讨论】:
-
如果变量总是设置为真,为什么首先要使用变量?删除条件,如果您还没有从方法返回,则始终打印使用情况。
-
如果您知道
a始终是true为什么不完全删除if? -
C# 规范 8.1 端点和可达性: 为了确定特定语句或端点是否可达,编译器根据定义的可达性规则执行流分析每个语句。流分析考虑了控制语句行为的常量表达式(第 7.19 节)的值,但不考虑非常量表达式的可能值。换句话说,出于控制流分析的目的,给定类型的非常量表达式被认为具有该类型的任何可能值。
-
只是对 Style 的评论。您正在使您的代码更复杂,以便放置一个单点退出。这可以说是不鼓励的。见softwareengineering.stackexchange.com/questions/104551/… 和softwareengineering.stackexchange.com/questions/118703/…
标签: c# compiler-errors static-analysis