新的C#7模式匹配和可达性

InB*_*een 7 c#

这是基于这个问题,在我看来编译器中存在语言故障或缺失警告.我的理由是is将始终返回true以下类型的表达式:

int i;
if (i is var j) ....
Run Code Online (Sandbox Code Playgroud)

更进一步,请考虑以下代码:

int i;
if (i is int) .... //Compiler warning: The given expression is always
                   //of the provided ('int') type.
Run Code Online (Sandbox Code Playgroud)

但是,var如果你这样做:

if (i is int j) ...
else ...
Run Code Online (Sandbox Code Playgroud)

您将不会得到任何警告(trueelse子句中检测到表达式始终或无法访问的代码)基本上是相同的行为.

这让我想一想,如果我的初步推理可能是错误的.是否有一些模糊的使用/角落情况我错过了哪里真的有所作为?如果没有,那么缺少的警告和不一致的行为是编译器中的疏忽(甚至是错误)吗?

D-J*_*nes 3

我相信这是设计使然,参考 roslyn 源代码,从这里开始:Binder_Operators,第 2848 行

因为这里提出的启发式是用来改变代码生成的,所以它必须是保守的。在人类可以逻辑推断操作符总是返回 [true] 的情况下,我们不报告警告是可以接受的。如果存在可能[失败]的情况,错误地警告操作员将始终返回[true],这是不可接受的。