“使用范围运算符”建议修复产生无效代码

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

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

AAA*_*ddd 5

不考虑任何其他问题并解决手头的问题,您不能在诸如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