为什么F#string可以';t在三重引号中以双引号结尾?

为什么F#string可以';t在三重引号中以双引号结尾?,string,f#,double-quotes,String,F#,Double Quotes,我是一名试图学习F的C开发人员 据我所知,F#2.0有两种字符串语法:普通字符串和逐字字符串()。在F#3.0版本中,有一个称为三倍引号字符串的功能 据我所见,在这种字符串格式中,“之间的每一项内容都是逐字逐句的字符串文字,不需要像双引号一样转义 例如,所有这些都是有效字符串 let a = """ This is a valid "string" """ let b = """ This is a valid \string """ let c = """ This is a valid 's

我是一名试图学习F的C开发人员

据我所知,F#2.0有两种字符串语法:普通字符串和逐字字符串()。在F#3.0版本中,有一个称为三倍引号字符串的功能

据我所见,在这种字符串格式中,
之间的每一项内容都是逐字逐句的字符串文字,不需要像双引号一样转义

例如,所有这些都是有效字符串

let a = """ This is a valid "string" """
let b = """ This is a valid \string """
let c = """ This is a valid 'string """
但它有一个规则

三引号字符串中的引号不能以双引号(“)结尾, 但是它可以从一开始

所以这是一个合法的字符串

let s = """"This is a valid string"""
但事实并非如此

let s = """This is a valid string""""
这是为什么?我看了,但我找不到任何关于为什么在字符串开头使用而不是结尾使用它是合法的信息


你能告诉我吗?

答案很简单:编译器看到三个引号时,三个引号的字符串就结束了。因此
“a”“
是由字符
a
组成的字符串,后跟一个额外的
,它开始一个新字符串

如果要编写模糊代码,可以执行以下操作:

f"""a""""b"

用两个字符串调用函数
f
“a”和
“b”

可能会混淆lexer/tokenizer。我想您只需要在第一个
后面加一个空格至少,这样我可以看到哪里可能出错了。好吧,你的回答在我看来是合乎逻辑的。赞成的。但是为什么编译器不考虑最后三个引号而不是前三个引号?因为在开始的时候,编译器会考虑前三个引号。s是字符串的一部分。例如,
“a”
可能是空字符串,因为在3个引号之后有3个引号。当编译器看到这3个引号时,它可能会说“好的,让我们结束这个字符串”。至少它应该给出编译时错误。但它是一个有效字符串。这让我很困惑。@SonerGönül:实际上是
“a”
确实给出了编译时错误。正如您正确预期的,三引号字符串可以以一个或两个引号开头,但不能以三个引号开头。