【问题标题】:VS 2017 Bug or new features?VS 2017 Bug 还是新功能?
【发布时间】:2017-07-28 21:28:12
【问题描述】:

升级到 VS 2017 后,此代码出现以下错误(一直运行良好)

byte[] HexStringToByteArray(string hex)
    {
        if (hex.Length % 2 == 1)
            throw new Exception("The binary key cannot have an odd number of digits");

        byte[] arr = new byte[hex.Length >> 1];

        for (int i = 0; i < hex.Length >> 1; ++i) // Error in this line
        {
            arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
        }

        return arr;
    }

例外:

Error 1: The variable 'i' cannot be used with type arguments
Error 2: 'hex' is a variable but is used like a type    

解决方案是用括号括住表达式。

for (int i = 0; i < (hex.Length >> 1); ++i)

但这让我想知道这是一个错误还是一个新功能? 谢谢。

【问题讨论】:

  • 这是一个错误,非常大。 It belongs here,点击新建问题按钮。
  • @NineBerry 除非 OP 在升级到 VS2017 之前使用 C# 1.0,否则我不确定这是一个合适的欺骗目标。
  • 任何有兴趣的人,this has been logged as an issue on Github
  • @NineBerry:不是骗子;正如对该问题的回答所描述的那样,这种特定的解析在遵循规范时是一个错误,因为&gt;(即另一个&gt;)之后的标记不是允许解释为类型参数列表的列表之一。如果编译器指定语言,“编译器只是更改了启发式”将是有效的,但即使您认为它确实如此,问题仍然不是重复的。不过,这是很好的参考资料。
  • 作为一个完全不相关的东西,如果你想除以2,写x / 2,而不是x &gt;&gt; 1。位移位“更快”,因此应该是首选,这是一个持续存在的误解。不是,也不应该。写下你的意思。当您将它与 旨在获取特定位的位移混合时尤其如此(例如 &lt;&lt; 4 表示这些将是高 4 位)。这将是一个幸运的巧合,也避免了解析器错误。

标签: c# roslyn c#-7.0


【解决方案1】:

感谢您报告此事。这是解析优先级的确认回归。此修复程序最迟将在 VS2017 的第一个季度版本中发布。

修复信息:https://github.com/dotnet/roslyn/pull/16834

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多