C#逐字字符串换行符:CRLF,CR或LF?

Jam*_*mes 5 c# newline verbatim-string

今天,我遇到了一个有趣的问题,即使在使用相同配置的情况下,我的测试在构建机器上也能正常运行时,在构建机器上始终无法通过测试。当我查看故障转储中Assert.AreEqual输出的差异时,看不到任何差异。经过一番调查,我发现测试用例源代码中的逐字字符串(跨越多行)在我的计算机上使用CRLF,但在构建计算机上使用LF,导致该字符串与生成的字符串进行比较字符串失败。罪魁祸首是两个系统上的Git设置不一致,构建系统会自动将CRLF序列转换为LF。

C#规范是否说明了应如何解释逐字字符串中的换行符(也许使用Environment.Newline或至少是一些一致的东西)?这似乎是一个问题,可能会以非常难以诊断和解决的方式(特别是使用.NET Standard)咬伤很多人。例如,如果您有一个.NET Standard项目,并且在Linux和Windows上都有团队成员,则这很可能会伤及Linux团队成员或Windows团队成员。

小智 5

该规范通过不解决这个问题来解决这个问题:

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-struct

在逐字字符串文字中,分隔符之间的字符会逐字解释,唯一的例外是quote_escape_sequence

由于行结尾没有例外,因此您可以获得源文件中使用的任何行结尾。正如你发现的那样。

  • @肯尼思K。如果 OP 配置源代码控制的方式是在其他机器上将 CRLF 替换为 LF(并且 OP 已经这样做了),那么不会。 (3认同)