我的一位同事从以下代码开始:
var newList = new List<>();
foreach(var item in otherList)
{
newList.Add(GetNewObjectFrom(item));
}
ReSharper 在此处正确识别了 LINQ 的使用,并将其更改为:
var newList = otherList.Select(o => GetNewObjectFrom(o)).ToList();
但是,lambda 是不必要的,可以通过传递方法进一步简化:
var newList = otherList.Select(GetNewObjectFrom).ToList();
我的问题:
Visual Studio 2010 Professional 中的任何工具或 ReSharper 的各种变通工具都可以检测到应该进行的这种更改吗?我意识到最好的工具是第二组人眼,这就是这个问题的起点……但我的工作越多由计算机完成越好。
编辑:太棒了,这是一个 ReSharper 错误。这是一个示例程序:
using System.Linq;
namespace ResharperMethodGroupBug
{
class Program
{
static void Main(string[] args)
{
var program = new NumberProgram(new NumberProcessor());
program.Run();
}
}
class NumberProgram
{
private readonly INumberProcessor numberProcessor;
public NumberProgram(INumberProcessor numberProcessor)
{
this.numberProcessor = numberProcessor;
}
static long SquareNumber(int n)
{
return n * n;
}
public void Run()
{
var listOfNumbers = Enumerable.Range(1, 100).ToList();
// appropriately triggers "convert to method group"
var listOfSquares = listOfNumbers.Select(n => SquareNumber(n));
// does not trigger "convert to method group" when it should
var listOfCubes = listOfNumbers.Select(n => this.numberProcessor.CubeNumber(n));
// proof that a method group works here
var anotherListOfCubes = listOfNumbers.Select(this.numberProcessor.CubeNumber);
}
}
interface INumberProcessor
{
long CubeNumber(int n);
}
class NumberProcessor : INumberProcessor
{
public long CubeNumber(int n)
{
return n * n * n;
}
}
}
编辑 2:我在 JetBrains 的 Youtrack 上发布了一个问题:http: //youtrack.jetbrains.com/issue/RSRP-301259