C#:任何抑制编译器错误的方法都类似于抑制警告消息?

时间:2011-02-14 23:02:46

标签: c# compiler-errors error-suppression

我有以下代码生成编译器错误:

    Boolean IConvertible.ToBoolean(IFormatProvider provider)
    {
        ThrowHelper.ThrowInvalidCast(typeof(MyType), typeof(Boolean));
    }

编译器抱怨并非所有代码路径都返回一个值。这里的问题是ThrowHelper将始终抛出错误。它是一个静态类,调用静态方法。

我理解我可以在ThrowHelper调用之后用愚蠢的“return true”来满足编译器,但这似乎是不必要的代码。我知道我可以抑制警告消息,但是当我尝试使用SuppressMessageAttribute时,它并没有阻止编译器抱怨。有没有办法只为这种方法抑制这个错误?

3 个答案:

答案 0 :(得分:8)

你可以让ThrowHelper中的方法只创建异常,而不是实际抛出它。

Boolean IConvertible.ToBoolean(IFormatProvider provider)
{
    throw ThrowHelper.CreateInvalidCast(typeof(MyType), typeof(Boolean));
}

这可能会导致更好的堆栈跟踪:它将指向ToBoolean,而不是ThrowInvalidCast。

答案 1 :(得分:6)

除了修复错误之外,无法抑制错误。

错误本质上表明编译器认为它无法生成有效代码。抑制错误的唯一方法是修复错误。只需添加它想要的return语句,然后在Microsoft Connect上引发一个问题,表明您认为编译器错误。

但是,我怀疑这是预期的行为,因为编译器不知道您调用的方法将始终抛出并确定以可预测的方式对任何可能的调用树进行操作将是困难的,如果不是不可能的话(想象一下)如果你在结束投掷之前调用了20个方法的链。)

答案 2 :(得分:3)

简单的大脑练习为什么所要求的功能可能导致问题。想象一下,ThrowHelper.ThrowInvalidCast在某些第三方库中定义。您可能知道该方法始终抛出并告诉编译器它,或者一个非常高级的静态分析器可能能够确定该方法在编译代码时始终抛出

现在其他一些开发人员部署了该库的更新版本。现在该方法并不总是抛出。突然之间,有一种情况是您的方法没有返回路径。只是为了处理这种情况,编译器(或运行时)必须包括备份计划在这种情况下要做什么。对于可以通过编写正确代码轻松修复的内容来说,相当多的开销。

更新:从理论上讲,可以扩展C#以允许没有返回路径的方法。 Eric Lippert在评论Jon Skeet的回答时提到了here

  

“never”方法只是一个void方法,不允许有可达到的终点或任何return语句。这解决了编译时的问题。在运行时,验证者有责任确保方法实际上正确地实现其返回类型语义;验证者可以类似地确定没有返回指令,并且终点不可达。