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



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

int i;
if (i is var j) ....

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

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

但是,与var相同,如果您这样做:

if (i is int j) ...
else ...

您不会收到任何警告(给定的表达式并不总是true或在else子句中检测到无法访问的代码(本质上是相同的行为。

这让我考虑我最初的推理是否是错误的。我是否缺少一些晦涩的用途/角落情况,这真的会有所作为?如果不是,缺少警告和不一致的行为是编译器中的疏忽(甚至错误(吗?

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

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

最新更新