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

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

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

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

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

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

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

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

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

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

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

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

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

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

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