Dav*_*haw 34 c# throw compiler-warnings
为什么以下代码行没有创建编译器警告?
void Main()
{
throw new Exception();
throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)
在我看来,编译器应通知您无法达到第二次抛出异常.
Eri*_*ert 38
它显然是一个编译器错误,它是在C#3.0中引入的 - 就在我大量重构可达性检查器的时候.这可能是我的坏事,对不起.
这个bug完全是良性的; 基本上,我们只是在警告记者中忘记了一个案例.我们正确生成可达性信息; 正如其他人所说,我们在codegen之前正确地删除了无法访问的代码.
该错误只不过是警告生成器中的缺失案例.我们在那里有一些棘手的代码,可以确保当您使一些大部分代码无法访问时,我们不会报告大量警告.编译器具有专门报告无条件getos警告的代码("goto","break","continue"),条件gotos("if","while"等等),try-catch-finally(包括等效表单) try-catch-finally,如lock和using),blocks,returns(yield return和regular return),本地声明,标签语句,开关和表达式语句.
你在那份名单上看到"抛出陈述"吗?我也不.那是因为我们忘了它.
不便之处敬请原谅.我将向QA发送一份说明,我们将在此版本的语言中修复此问题.
谢谢你引起我的注意.
它可能会给编译器警告/错误,但遗憾的是它没有.但是如果你看一下IL代码,只会考虑第一个异常.您可以登录connect.microsoft.com并将其提升为您希望看到的内容.
如果您使用以下代码进行ILDasm
static void Main(string[] args)
{
Console.Write("Line 1");
throw new Exception();
throw new Exception();
Console.Write("Line 4");
}
Run Code Online (Sandbox Code Playgroud)
你会得到这个
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 18 (0x12)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Line 1"
IL_0006: call void [mscorlib]System.Console::Write(string)
IL_000b: nop
IL_000c: newobj instance void [mscorlib]System.Exception::.ctor()
IL_0011: throw
} // end of method Program::Main
Run Code Online (Sandbox Code Playgroud)
在第一个Exception对象之后,没有其他任何东西被转换为IL.