这是基于这个问题,在我看来,这是语言故障或编译器中缺少警告。我的理由是,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] 是不可接受的,如果存在可能 [失败] 的情况。