当我尝试做
char c = (char)-1;
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误,指出无法将常量值“-1”转换为“字符”
这让我认为这是一个无效的转换。但是当我在运行时执行此操作时,我会找回角色'\uffff'。
出于好奇,那个字符是什么,为什么编译器不喜欢它?
C# 使用 Unicode UTF-16 来编码字符串和字符。ffff在 UTF-16 中是“非字符”。当您使用\u它作为字符串前缀时,它会告诉 C# 将以下字符视为 Unicode 代码点。所以在这里,您的代码点是ffff十六进制或65535十进制。char在C#中被表示为a ushortunder the hood,两者之间存在隐式转换。这里-1超出了 的范围ushort并且溢出到ushort.MaxValue是65535。(默认情况下,C# 中的整数运算不会在溢出时引发异常。要启用此行为,请使用checked块。)