C#Verbatim String Line Breaks:CRLF,CR还是LF?

时间:2018-01-10 22:02:33

标签: c# newline verbatim-string

今天我遇到了一个有趣的问题,我的测试在构建机器上一直失败,即使使用相同的配置它们在我的机器上工作得很好。当我在故障转储中查看Assert.AreEqual输出的差异时,我看不出有什么不同。经过一系列调查后,我发现测试用例源代码中的逐字字符串(跨越多行)在我的机器上使用CRLF,但在构建机器上使用LF,导致该字符串与生成的比较字符串失败。罪魁祸首证明两个系统上的Git设置不一致,构建系统自动将CRLF序列转换为LF。

C#规范是否说明了如何解释逐字字符串中的换行符(可能使用Environment.Newline,或者至少是一致的)?这似乎是一个问题,可能会让很多人难以诊断并且难以修复,尤其是.NET Standard。例如,如果您有一个.NET Standard项目,并且在Linux和Windows上都有团队成员,那么很可能会咬住Linux团队成员或Windows团队成员。

2 个答案:

答案 0 :(得分:3)

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

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure

  

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

由于行结尾没有异常,因此您可以获得源文件中使用的任何行结尾。你发现了。

答案 1 :(得分:0)

这个基于Git帮助文档的解决方案可以帮助确保一致性,无论每个Git实例的设置如何。

根据https://help.github.com/articles/dealing-with-line-endings/

中的文档
  

或者,您可以配置Git管理线路结尾的方式   通过配置特殊的.gitattributes文件来建立每个存储库。   此文件已提交到存储库并覆盖   个人的core.autocrlf设置,确保一致的行为   所有用户,无论他们的Git设置如何。