【问题标题】:Possible mistaken empty statement – compiler is mistaken in this case可能错误的空语句——在这种情况下编译器是错误的
【发布时间】:2015-08-10 01:49:19
【问题描述】:

我觉得问这个很傻,但是我如何告诉编译器这不是一个错误?我真的打算在我的 if 语句中添加一个“空”分支,并在末尾添加一个明确的 else 来捕获错误值。

我当然可以围绕这个重组整个if,但结果会不太清楚,而且解决一个愚蠢的编译器警告似乎很奇怪。如果我不必禁用整个警告,我也希望仅针对此特定语句。

【问题讨论】:

  • 所以你想要警告......但你不想要警告?这对我来说意义不大。另外,我认为空的if 只使用else 分支是错误的形式。我很想看到一个证明我错了的例子。
  • 我想要一般的警告,但我也想要if 中的一个空分支,而编译器不会说这是一个错误。
  • 你说你可以重写;你能在你的问题中提供一个简单的例子来说明为什么这不那么可读吗?
  • 我可以,但这与问题无关。我在问是否有人知道一种方法来指示编译器我编写的代码不是错误,而不是引发关于正确编码形式的辩论。
  • 你说得对,这不相关。我还是很想看。而且,很多时候人们不会问他们真正想要的是什么。更多上下文可能会带来更好的整体解决方案。

标签: c#


【解决方案1】:
#pragma warning disable xxxx
if (condition)
{
  // north of the wall, nada, nothing
}
else
{
  // code
}
#pragma warning restore xxxx

【讨论】:

  • 当然,但是我特别提到这是一个可能的解决方案并放弃了它。重新散列似乎毫无意义。
  • “如果我不必禁用整个警告,我宁愿只为这个特定的声明。” - 这正是您所得到的,您正在禁用“if”语句的警告。
【解决方案2】:

为什么不直接在 if 条件前面加上一个大括号,这样您就可以完全避免使用 else

if(!condition){
  //just work here
}

编辑:根据问题作者评论(其多个条件)更新答案

if(condition1){
  // code here
}
else if(condition2){
  // code here
}
else if(!condition3){
  //error case here
}

【讨论】:

  • 这不仅仅是一个if..else 语句,它有多个分支。
【解决方案3】:

好吧,我知道这很愚蠢,只需使用一个空块就可以摆脱它:

if(condition1)
  // code here
else if(condition2)
  // code here
else if(condition3)
{
    //nothing to do
}
else
  // error case here

【讨论】:

    【解决方案4】:

    为了抑制编译器警告,VS2010 有编译器选项和#pragma 选项。编译器选项影响整个程序。 #pragma 选项会影响整个程序。 #pragma 选项还可以在目标代码之前本地关闭特定警告,然后在之后再打开。 #pragma warning disable 0642 将隐藏 this 警告。 #pragma warning restore 0642 将恢复它。这太丑了。我见过的其他 IDE 允许单行覆盖警告(紧跟在激发代码之后的注释中的特定文本),但 VS2010 似乎没有这样做。 (我可能是错的。有人知道吗?)

    唯一的解决办法比你的“问题”更糟糕。本地 #pragma 指令将使您的代码比实际更难看,同时删除警告。最终,你最好按照聪明人的建议去做。 (他们有时会错过机会。)按自己的方式行事并不一定会获胜。您必须承认这种可能性才能获得关于如何做到这一点的答案无论是否是一种改进。

    基本上这个问题是一个偏好问题。你应该从一开始就这么说,通过展示(用代码)你在说什么,而不是让他们猜测和猜测来辱骂乐于助人的人。

    编译器警告建议您可能不应该这样写:

    if (expression)
        ;  // Do nothing, because blah blah blah.
    else
    {
        code that;
        does something;
    }
    

    ,而是选择以下之一:

    if (expression)
    {
       // Do nothing, because blah blah blah.
    }
    else
    {
        code that;
        does something;
    }
    

    if (expression)
    { }  // Do nothing, because blah blah blah.
    else
    {
        code that;
        does something;
    }
    

    您没有“特别提到这一点”(别人对您从未提供过的代码的重写)“作为一种可能的解决方案......”。您也没有说您是否拒绝 Riad 将 ; 更改为 { ... } 或他周围的#pragmas(顺便说一句,只有在您不将 ; 更改为 { ... } 时才有必要)。

    这些变化绝不会等同于“围绕 [删除] 这个 [警告] 重构 [ing] 整个 if [语句]”。 (那就是if (!expression) { code that; does something; }。)

    这些变化绝不比原版“不那么清晰”。

    我不介意知道一个不难看的覆盖。我可能想写如下内容,因为我喜欢省略所有那些愚蠢的围绕空行的大括号,它们会使这样的部分高一倍:

    if (condition1)
      action1;
    else if (condition2)
      ;  // (do nothing)
    else if (condition3)
      action3;
    else if (condition4)
      ;  // (do nothing)
    else if (condition5)
      action5;
    else
      action99;
    

    显然,我必须使用更丑陋的选项之一来避免那些烦人的“可能错误的空语句”警告。

    【讨论】:

      【解决方案5】:

      如果你替换

      ;
      

      ((Action)(() => { }))();
      

      ,警告应该消失。

      (缺点:这可能需要在运行时执行,浪费时间。如果是这样,它应该只用于跟踪(如果它适用的话),并且应该在发货前将其删除或更换。)

      来自:Simple C# Noop Statement

      【讨论】:

      • 简单地使用{ }会更好。
      猜你喜欢
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2018-09-16
      相关资源
      最近更新 更多