我正面对这段代码:
#if DEBUG
return thisVariable;
#endif
return thatVariable; //<-- warning CS0162 here
它工作正常,除了我在第二个返回语句上收到代码无法访问的警告。尽管有警告,但在发布模式下运行程序时,代码实际上是非常容易的。
为什么我收到这个警告?
答案 0 :(得分:13)
如果您正在执行定义了DEBUG符号的构建,那么编译器正在执行代码的静态分析,假设第一次返回有效且不排除。所以你的代码将被视为:
return thisVariable;
return thatVariable;
在这种情况下,很明显第二个return
语句在这样的构建中无法实现。当您切换到未定义DEBUG的构建配置时,您不应该看到警告。
在定义DEBUG时,请考虑使用#else
(docs)来避免第二个return
语句。
还有来自here的这个相关信息:
虽然编译器没有单独的预处理器,但是 本[C#预处理器指令]部分中描述的指令是 处理好像有一个。
换句话说,C#编译器的静态分析不知道预处理器指令;它们已经在那时处理过了,静态分析只能看到从预处理阶段产生的代码。