【问题标题】:"Use range operator" suggested fix produces invalid code“使用范围运算符”建议的修复会产生无效代码
【发布时间】:2021-05-22 04:45:38
【问题描述】:

来自 .NET 4 的 ASP.NET 5 MVC 项目使用 Substring 是类似源代码

id = row.Categoryid?.Substring(0, 1) == "$" ? row.Categoryid?.Substring(startIndex: 1) :
                                               row.Categoryid?.Substring(0)

Visual Studio 2019 质检员抛出消息

IDE0057 子串可以简化

开始索引:1

应用建议的修复后

使用范围运算符

代码重构为

id = row.Categoryid?.Substring(0, 1) == "$" ? row.Categoryid?.Substring[1..] :
                                               row.Categoryid?.Substring(0)

引发编译错误

错误 CS0021 无法将带有 [] 的索引应用于类型表达式 '方法组'

如何解决这个问题,以便重构创建正确的代码?

【问题讨论】:

  • 不修复编译错误,但你不能这样做:id = row.Categoryid.Trim('$') 或者特别是开始var id = row.Categoryid.TrimStart('$')
  • 这听起来像一个错误。您可以直接通过github.com/dotnet/roslyn/issues/… 向 Roslyn 举报,以便修复。
  • 项目文件中TargetFrameworkLangVersion 属性的值是多少?是否指定了其中一个或两个?
  • 项目文件包含<TargetFramework>net5.0</TargetFramework>未指定LangVersion
  • 我现在看到@00110001 的编辑说明这是一个已修复的known bug。这就是为什么它不会在我的本地构建中复制的原因。所以,你应该很快就会有一个修复版本。

标签: c# visual-studio asp.net-core asp.net-core-mvc roslyn-code-analysis


【解决方案1】:

忽略任何其他问题并解决手头的问题,您不能在 method 上使用 range,例如 Substring Eg Categoryid.Substring[1..] p>

应该是:

row.Categoryid?[1..] 

或将其推向合乎逻辑的结论:

var id = row.Categoryid?[0] == '$' ? row.Categoryid?[1..] : row.Categoryid;

至于为什么建议这样做完全是另一个问题。它可能是 VS 错误,也可能是 Resharper,具体取决于建议和实现的内容

注意:假设您只是想从字符串的开头删除$,并且永远只有一个(或者如果有多个,您想要它们也被删除)。您可以使用TrimStart 为自己节省一堆可打印字符

从当前字符串中删除所有指定字符的前导匹配项。

id = row.Categoryid?.TrimStart('$');

更新

因此,进一步分析,这是与 Null-conditional operator 相关的错误。当它被删除时row.Categoryid.Substring(1) 正确替换row.Categoryid[1..]

更新

进一步的更新,这似乎是一个已知的错误,并且已经有针对此问题的拉取请求,计划发布16.9.P1

Fix "IDE0057: Invalid code fix with string.Substring and null-conditional operator" #47377

【讨论】:

  • 如果有多个前导 $ 字符,TrimStart 将有不同的行为。
  • @DrewNoakes 好点,我记下了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多