问题描述
来自 .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 无法将带有 [] 的索引应用于类型表达式 '方法组'
解决方法
不考虑任何其他问题并解决手头的问题,您不能在 方法 上使用 range,例如 Substring
例如 {{1 }}
应该是:
Categoryid.Substring[1..]
或者将其推导出合乎逻辑的结论:
row.Categoryid?[1..]
至于为什么建议这样做完全是另一个问题。这要么是 VS 错误,要么是 Resharper,具体取决于建议和实施的内容
注意:假设您只是想从字符串的开头删除一个 var id = row.Categoryid?[0] == '$' ? row.Categoryid?[1..] : row.Categoryid;
,并且永远只有一个(或者如果有多个,您也希望将它们删除)。您可以使用 TrimStart
为自己节省一堆可打印字符。
从当前字符串中删除所有指定字符的前导匹配项。
$
更新
所以进一步分析,这是一个与 Null-conditional operator 相关的错误。当它被移除时,id = row.Categoryid?.TrimStart('$');
会正确替换 row.Categoryid.Substring(1)
更新
进一步更新,这似乎是一个已知的错误,并且已经有一个针对此问题的拉取请求,该问题计划发布于 row.Categoryid[1..]
Fix "IDE0057: Invalid code fix with string.Substring and null-conditional operator" #47377