1

私の同僚は、次のコードから始めました。

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

4

1 に答える 1

3

Resharper はすでにこれを検出しており、簡略化を提案しています。

    static void Main(string[] args)
    {
        var items = new[] { 1, 2, 3 };
        var list = items.Select(i => Foo(i)).ToList(); // R# suggests "Convert to method group"
    }

    static int Foo(int i)
    {
        return i;
    }

(VS2010 Pro SP1 および R# 5.1.3 でテスト済み)

于 2012-05-10T16:11:10.933 に答える