And*_*rus 1 c# visual-studio asp.net-core-mvc roslyn-code-analysis asp.net-core
来自 .NET 4 的 ASP.NET 5 MVC 项目使用 Substring 是源代码,如
id = row.Categoryid?.Substring(0, 1) == "$" ? row.Categoryid?.Substring(startIndex: 1) :
row.Categoryid?.Substring(0)
Run Code Online (Sandbox Code Playgroud)
Visual Studio 2019 质量检查员抛出消息
IDE0057 子串可以简化
在
开始索引:1
应用建议的修复后
使用范围运算符
代码重构为
id = row.Categoryid?.Substring(0, 1) == "$" ? row.Categoryid?.Substring[1..] :
row.Categoryid?.Substring(0)
Run Code Online (Sandbox Code Playgroud)
抛出编译错误
错误 CS0021 无法将带有 [] 的索引应用于“方法组”类型的表达式
如何解决这个问题,以便重构创建正确的代码?
不考虑任何其他问题并解决手头的问题,您不能在诸如Eg 之类的方法上使用范围SubstringCategoryid.Substring[1..]
它需要是:
row.Categoryid?[1..]
Run Code Online (Sandbox Code Playgroud)
或者将其推导出合乎逻辑的结论:
var id = row.Categoryid?[0] == '$' ? row.Categoryid?[1..] : row.Categoryid;
Run Code Online (Sandbox Code Playgroud)
至于为什么提出这个建议完全是另一个问题。它要么是 VS 错误,要么是 Resharper,具体取决于建议和实施的内容
注意:假设您只是想$从字符串的开头删除一个,并且总是只有一个(或者如果有多个,您也希望将它们删除)。你可以为自己节省一堆打印字符使用TrimStart。
从当前字符串中删除指定字符的所有前导匹配项。
id = row.Categoryid?.TrimStart('$');
Run Code Online (Sandbox Code Playgroud)
因此,在进一步分析中,这是一个与Null 条件运算符有关的错误。当它row.Categoryid.Substring(1)被正确移除替代品时row.Categoryid[1..]
进一步更新,这似乎是一个已知的错误,并且已经有一个针对此问题的拉取请求计划发布 16.9.P1
修复“IDE0057:使用 string.Substring 和空条件运算符修复无效代码”#47377