C# 为什么C“需要两个双引号来打印”;如果是逐字字符串?

C# 为什么C“需要两个双引号来打印”;如果是逐字字符串?,c#,programming-languages,double-quotes,verbatim-string,C#,Programming Languages,Double Quotes,Verbatim String,如果我存储一个逐字字符串, string s=@“Hello”它应该假设地解析字符串并打印“Hello”(将“字符作为字符串的一部分) 但在实际操作中,它失败了,相反,string s=@“Hello”;显示所需的输出(“Hello”) 为什么语法需要额外的“字符?如果C#开始以上述假设的方式运作,会产生什么样的破坏性后果 从技术上讲,字符串s=@“Hello”;应该打印“你好” 不,那是无效的。编译器应该——并且确实——遵守语言规范的规则 在逐字字符串文字中,双引号必须加倍(而不是三倍),以区

如果我存储一个逐字字符串,
string s=@“Hello”
它应该假设地解析字符串并打印
“Hello”
(将
字符作为字符串的一部分)

但在实际操作中,它失败了,相反,
string s=@“Hello”;
显示所需的输出(
“Hello”

为什么语法需要额外的
字符?如果C#开始以上述假设的方式运作,会产生什么样的破坏性后果

从技术上讲,字符串s=@“Hello”;应该打印“你好”

不,那是无效的。编译器应该——并且确实——遵守语言规范的规则

在逐字字符串文字中,双引号必须加倍(而不是三倍),以区别于仅表示“字符串结尾”的双引号

如果在字符串中间使用双引号,而不是在开头或结尾使用双引号,则最容易看到这一点:

string x = @"start "" end";
F#在上述情况下工作得非常好

我看不远。在VS2015预览版中的F#项目示例中:

let x = @""Hello""
。。。给出一个错误,而
@““Hello”
将导致一个字符串
“Hello”

此外,建议它完全按照C#工作:

如果前面有@符号,则文字为逐字字符串。这意味着忽略任何转义序列,除了两个引号字符被解释为一个引号字符之外

基本上,听起来逐字字符串文字在C#和F#中都能很好地工作,它们都需要双引号。F#也有三倍的引号字符串,在其中它们不需要加倍。。。但这只是C#没有的一个单独的特性

编辑:为了回答您关于歧义的评论,您给出了一个
@“1”2“
的示例。让我稍微改变一下:

string x = @"1"+"";
目前在C#中,这意味着逐字字符串文字与内容
1
和空的常规字符串文字的串联。如果您建议它实际上应该是一个包含内容
1“+”
的单个逐字字符串文字,解析器直接依赖于下一个分号之前的引号作为逐字字符串文字的结尾,我觉得这是一个非常糟糕的主意。例如,假设我想使用逐字字符串文字作为双参数方法调用的第一个参数,如下所示:

Console.WriteLine(@"Foo {0}", "Bar");
按照您的规则,这将是一个只有一个参数的调用-不可能将我们试图进行的调用表示为一个语句。(您需要为逐字字符串文字使用一个变量,以避免它把事情搞砸。)


简言之,我对C#的工作方式感到高兴。

这是因为你也需要一个开头和结尾“字符。因此,对于像你这样的一行:

s=@"""Hello""";

第一个和最后一个引号字符用于向编译器指示字符串的开始和结束。然后在字符串中,双引号序列(“”)用于指示您希望在字符串中包含引号字符。

第一个和最后一个引号是分隔符。例如
字符串s=@“User”“ChaZ”询问引号“
编译器仍然需要知道字符串的结尾。因为您的计算机(而不是其他计算机)不知道您希望字符串停止在哪里?不解释转义序列是一回事,但这一个字符仍然很特殊…这是一个问题还是一个咆哮?此外,您似乎在询问C语言设计决策时,却不真正理解基本语法。@RowlandShaw@ed@kobi@rominox:它可以知道字符串的结尾在哪里。@RowlandShaw@ed@kobi@rominox:使用内部引号的前置词。例如:
@“1”2";
前面的引号
1
可用作起点,前面的引号
可以是端点,中间的任何字符串都是必需的字符串。为什么要多穿一双?:谢谢你的回答,但困惑仍然存在。解析器可以通过使用第一个出现的
和最后一个出现的
(在
之前;
)来理解字符串的起点和终点。例如:
@“1”和“2”
前面的引号
1
可用作起点,前面的引号
可以是端点,这两点之间的内容应解析为字符串。为什么编译器需要一个额外的对来有效地解析它?请原谅我的疑问,但作为一名学生,我正在尝试从基础知识学习C。@Chaz:不,解析器不是这样工作的——不可能,因为可能有“x”+“y”,例如,第一个文字的结尾不是分号前的最后一个引号。解析器的工作方式是在运行时使用标记——它需要知道它是否“在”字符串文本中。以您的示例为例,将2更改为a+。现在,这是一个单一的逐字字符串文字,还是一个逐字字符串文字与假设语言中的常规字符串文字串联在一起?jon:
解析器通过使用标记来工作
-哦!我怎么能从编译器设计类中忘记这一点?非常感谢斯基特先生,你的回答让我明白了。我真的很高兴收到你的回复,就像我过去一直对你感到好奇一样(虽然在这个问题上投了反对票),但这是更好的选择@查兹:我编辑了我的答案,以便更详细地了解你的建议的缺点,即你认为该语言应该如何工作。