首页 > 解决方案 > “使用范围运算符”建议的修复会产生无效代码

问题描述

来自 .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 无法将带有 [] 的索引应用于“方法组”类型的表达式

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

标签: c#visual-studioasp.net-coreasp.net-core-mvcroslyn-code-analysis

解决方案


忽略任何其他问题并解决手头的问题,您不能在诸如Eg之类的方法上使用范围SubstringCategoryid.Substring[1..]

它需要是:

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

修复“IDE0057:使用 string.Substring 和空条件运算符修复无效代码”#47377


推荐阅读