在 c# 中使用 #line 指令更改错误或警告的默认行号的原因是什么?

What is the reason behind using the #line directive in c# to change the error or warning's default line number?

我正在阅读有关 C# 中的#line 指令的 Microsoft 网页 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-line。它解释了 #line 200 指令强制下一行的编号为 200(尽管默认值为 #6)直到 #line default 指令 returns 行编号为其默认编号。

我的问题是,到底为什么我们需要为代码中的错误或警告更改行号?

class MainClass
{
    static void Main()
    {
#line 200 "Special"
        int i;
        int j;
#line default
        char c;
        float f;
#line hidden // numbering not affected
        string s;
        double d;
    }
}

编译产生以下输出:

Special(200,13): warning CS0168: The variable 'i' is declared but never used
Special(201,13): warning CS0168: The variable 'j' is declared but never used
MainClass.cs(9,14): warning CS0168: The variable 'c' is declared but never used
MainClass.cs(10,15): warning CS0168: The variable 'f' is declared but never used
MainClass.cs(12,16): warning CS0168: The variable 's' is declared but never used
MainClass.cs(13,16): warning CS0168: The variable 'd' is declared but never used

此指令在许多情况下都很有用,大多数 C# 开发人员从未见过。

我所知道的所有场景都涉及由其他进程生成或修改的 C# 文件,并且 #line 指令用于确保已编译的 .pdb 信息文件的版本提供了与原始输入相关的准确信息。

The documentation page you've been referred 以他们的例子暗示了这一点。他们想象一个构建步骤,在编译结果之前从原始 C# 文件中删除(删除)行。如果调试信息显示的是处理后的行号而不是原始行号,那么尝试调试该代码的人就会遇到困难,因为他们在调试时可能会查看原始编写的文件,而不是修改后的 pre-processed 文件.

我知道的其他示例包括 T4 处理的输出,以及编译 XAML 文件时生成的 C# 文件。在这些情况下,没有原始 C# 文件,但有原始创作文件,如果有异常或其他原因将行号传达给试图调试代码的人,他们会想从原始文件,而不是他们可能永远看不到的生成文件。