如何在 C# 中的转义序列中包含一个字符串

How do I include a string in an escape sequence in c#

我有一个字符串,它是变量和文本的组合,如下所示:

string str = $"\x0{str2}{str3}";

如您所见,我有一个 \x 的字符串转义序列,它需要 1-4 个十六进制字符。 str2 是一个十六进制字符(例如 D),而 str3 是两个十进制字符(例如 37)。我期望 str = "\x0D37" 的结果是 str 包含 ,但我得到的是空格,就好像 str == "\x0" 一样。这是为什么?

As per the specification,一个 内插字符串 在解析之前被拆分成单独的标记。要解析 \x 转义序列,它需要是同一标记的一部分,在本例中不是。在任何情况下,插值部分都不可能使用转义序列,因为它没有为非文字定义。

你最好直接生成一个 char 值,尽管这更复杂

string str = ((char) (int.Parse(str2 + str3, NumberStyles.HexNumber))).ToString();

回答为什么你的例子不起作用:

规范将 \x 称为“hexadecimal escape sequence”。

A hexadecimal escape sequence represents a single Unicode character, with the value formed by the hexadecimal number following "\x".

语法只允许以这种方式使用文字十六进制数字。 ANTLR 语法:

hexadecimal_escape_sequence
    : '\x' hex_digit hex_digit? hex_digit? hex_digit?;

hex_digit
    : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';

意思是,“序列 \x 后面紧跟一个、两个、三个或四个十六进制数字”。因此,转义只能用作源代码中的文字,不能在运行时连接。

Charlieface 为您的案例提供了一个很好的替代方案,但根据上下文,您可能需要重新考虑您的组织并且只使用一个字符串而不是两个字符串来保存字符。