VS2017可编译代码在VS2015报CS0103错误,求原因与解决办法
Why does my UTF-8 conversion code fail to compile in Visual Studio 2015 with CS0103 error?
我写了一段把UTF编码转换为字节的代码,在Visual Studio 2017里编译完全正常,但放到Visual Studio 2015里就编译失败了,报错是Error CS0103: 当前上下文中不存在名称'b00001111'。想问问这是啥原因,该怎么解决?
我的代码如下:
public IEnumerable<byte> AsUtf8() { //up to 7 bits if (Value <= 0x007F) { yield return (byte) Value; yield break; } //up to 11 bits if (Value <= 0x07FF) { yield return (byte) (0b11000000 | (0b00011111 & (Value >> 6))); //tag + upper 5 bits yield return (byte) (0b10000000 | (0b00111111 & Value)); //tag + lower 6 bits yield break; } //up to 16 bits if (Value <= 0x0FFFF) { yield return (byte) (0b11100000 | (0b00001111 & (Value >> 12))); //tag + upper 4 bits yield return (byte) (0b10000000 | (0b00111111 & (Value >> 6))); //tag + next 6 bits yield return (byte) (0b10000000 | (0b00111111 & Value)); //tag + last 6 bits yield break; } //up to 21 bits if (Value <= 0x1FFFFF) { yield return (byte) (0b11110000 | (0b00000111 & (Value >> 18))); //tag + upper 3 bits yield return (byte) (0b10000000 | (0b00111111 & (Value >> 12))); //tag + next 6 bits yield return (byte) (0b10000000 | (0b00111111 & (Value >> 6))); //tag + next 6 bits yield return (byte) (0b10000000 | (0b00111111 & Value)); //tag + last 6 bits yield break; } throw new UnsupportedCodepointException(); }
问题原因
这个报错的核心是C#版本的兼容性问题:
- Visual Studio 2015默认搭载的是C# 6.0编译器,而
0b前缀的二进制字面量语法是C# 7.0才新增的特性。 - 你的代码里大量用到了
0b11000000、0b00011111这类写法,在C# 6.0里,编译器会把0b当成变量名的一部分(比如把0b11000000误判成数字0加上未定义的变量b11000000),自然就会报“当前上下文中不存在该名称”的错误。 - 而Visual Studio 2017支持C# 7.0及以上版本,所以能正确识别这种二进制字面量语法,编译也就没问题了。
解决方法
这里有两种实用的解决方案,你可以根据自己的项目情况选择:
方案1:替换二进制字面量为十六进制/十进制等价值
既然C# 6.0不支持0b语法,咱们直接把所有二进制字面量换成对应的十六进制(用0x前缀)或者十进制数值就行。比如:
0b11000000等价于十六进制的0xC0,或者十进制的1920b00011111等价于十六进制的0x1F,或者十进制的31
修改后的代码示例(以前两个分支为例):
public IEnumerable<byte> AsUtf8() { //up to 7 bits if (Value <= 0x007F) { yield return (byte) Value; yield break; } //up to 11 bits if (Value <= 0x07FF) { yield return (byte) (0xC0 | (0x1F & (Value >> 6))); //tag + upper 5 bits yield return (byte) (0x80 | (0x3F & Value)); //tag + lower 6 bits yield break; } // 剩下的分支按照同样的规则替换所有0b开头的字面量即可 // ... 后续代码省略 throw new UnsupportedCodepointException(); }
这种方法不需要修改任何项目设置,兼容性拉满,能直接在VS2015里编译通过。
方案2:在VS2015中升级编译器以支持C# 7.0
如果你不想修改代码,可以尝试给VS2015的项目安装支持C# 7.0的编译器:
- 安装Microsoft.Net.Compilers NuGet包(版本2.0及以上),这个包会替换项目默认的编译器,让VS2015也能识别C# 7.0的特性,包括二进制字面量。
- 安装步骤:右键项目 → 管理NuGet程序包 → 搜索
Microsoft.Net.Compilers→ 安装最新的兼容版本。
不过要注意,这种方法可能会带来一些依赖问题,而且VS2015本身对C# 7.0的IDE支持(比如语法高亮、智能提示)不如VS2017流畅,所以如果项目需要长期在VS2015维护,更推荐方案1。
内容的提问来源于stack exchange,提问作者Huseyn Hesenli
相关产品推荐
相关产品推荐

