"Use range operator" 建议的修复产生无效代码

"Use range operator" suggested fix produces invalid code

ASP.NET .NET 4 中的 5 MVC 项目使用 Substring 是源代码,如

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

Visual Studio 2019年质检员抛出留言

IDE0057 Substring can be simplified

startIndex: 1

应用建议的修复后

Use range operator

代码重构为

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

会抛出编译错误

Error CS0021 Cannot apply indexing with [] to an expression of type 'method group'

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

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

它需要是:

row.Categoryid?[1..] 

或者以此为逻辑结论:

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

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

注意:假设您只是想从字符串的开头删除一个 $,并且永远只有一个(或者如果有不止一个,您还希望将它们删除)。您可以使用 TrimStart.

为自己节省一堆 可打印字符

Removes all the leading occurrences of a specified character from the current string.

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