私の同僚は、次のコードから始めました。
var newList = new List<>();
foreach(var item in otherList)
{
newList.Add(GetNewObjectFrom(item));
}
ReSharper はここで LINQ の使用を正しく識別し、次のように変更しました。
var newList = otherList.Select(o => GetNewObjectFrom(o)).ToList();
ただし、ラムダは不要であり、メソッドを渡すだけでさらに単純化できます。
var newList = otherList.Select(GetNewObjectFrom).ToList();
私の質問:
Visual Studio 2010 Professional 内のツール、または ReSharper のさまざまなアームツイストは、この変更を検出できますか? 最良のツールは人間の目の 2 番目のセットであることを認識しており、この質問はそもそもそこから来ています... しかし、私の仕事がコンピューターによって行われるほど、より良いものになります。
編集:すごい、それは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