【问题标题】:New C#7 pattern matching and reachability新的 C#7 模式匹配和可达性
【发布时间】:2017-08-25 14:42:52
【问题描述】:

这是基于this 问题,在我看来这是一个语言故障或编译器中缺少警告。我的理由是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 子句中检测到的无法访问的代码)本质上是相同的行为。

这让我考虑是否我最初的推理是错误的。是否有一些模糊的使用/角落案例我错过了这真的有影响?如果不是,那么缺少的警告和不一致的行为是否是编译器中的疏忽(甚至是错误)?

【问题讨论】:

  • 稍微修改了问题以显示它不是完全重复的。我本质上是在询问编译器的不一致行为,而不仅仅是这种模式的用例。
  • 如果您意识到(或怀疑)您对另一个问题的回答是错误的,那么您应该更正(或删除)您现有的答案,而不是重复该问题以再次提出完全相同的问题,而不是离开它(即使您认为它不正确)并再次发布问题。
  • 如果您想知道为什么 MS 选择做他们所做的事,那么您需要问 他们,而不是其他人,这里主要基于意见。我们无法告诉你为什么 MS 选择做他们做过或没做过的事情。
  • 转到 Visual Studio -> 发送反馈(在标题栏上)-> 报告问题。祝你好运
  • 我认为这是一个有效的问题 - 他要求人们向他解释推理是否正确以及是否有人可以提供何时发生这种情况的示例

标签: c#


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多