1

ReSharperからこのメッセージが届きます。ReSharperは、コードを調べた後で適切だと思う変更を提案していません。その結果、ReSharperが役に立たないのではなく、何が起こっているのか理解できないことが問題になるのではないかと心配しています。

public interface IFrobable { }

public class DataClass
{  
    public List<IFrobable> Frobables {get; set;}

    //...
}


public class WorkerClass
{
    //...

    void Frobinate(List<IFrobable> frobables)
    { 
       //Frobs the input
    }

    void DoSomething(List<IFrobable> input>)
    {
        //Original code with Resharper on OfType<IActivity>
        Frobinate(input.OfType<IFrobable>().ToList()); 

        //Suggested change from ReSharper - Is this a generic refactor 
        //instead of issue specific?
        Frobinate(Enumerable.OfType<IFrobable>(input).ToList()); 

        //What I think should be safe to do - compiles and appears to work
        Frobinate(input);
    }
}

私の提案した変更が安全でないかもしれない理由はありますか?

4

4 に答える 4

2

最後のケースでは、論理エラーが発生する場合と発生しない場合があります。

渡されFrobinateたリストを変更する機能、またはそれらの参照のコピーだけを変更する機能が本当に必要ですか?inputDoSomething

于 2012-12-12T20:45:32.737 に答える
2

これは通常の関数呼び出しです。

Enumerable.OfType<IFrobable>(input)

これは同じ関数ですが、拡張メソッドとして呼び出されます。

input.OfType<IFrobable>()

あなたの場合:

Frobinate(input);

次の理由で絶対に問題ありません:

input.OfType<IFrobable>().ToList()

等しい:

input.Where(x => x as IFrobable != null).ToList()

そして、あなたのメソッドinputはすでに定義されているList<IFrobable>ので、ポイントは何ですか?

于 2012-12-12T20:46:39.990 に答える
0
    //Suggested change from ReSharper

実際、上の拡張メソッドとしてではなく、OfType上の静的メソッドとして呼び出すことは、ReSharperからの提案ではなく、コンテキストアクションです。この投稿で違いを説明します。Enumerableinput

実際の問題へ:

検査

冗長な' IEnumerable.OfType<T>'呼び出し。null代わりに''と比較することを検討してください

ReSharperが迅速な修正ソリューションを提供するものではありません。明確に「正しい」変更を加えることは1つもないので、私は推測します。ただ言っているだけです

ねえ、すべて間違いなくタイプになります-このリストをフィルタリングしようとしている場合は、代わりにネスでフィルタリングすることを意図している可能性がinputありますIFrobablenull

これはおそらくあなたの場合には関係ありません。

提案された修正に関しては、すでに述べたように、これは、同じアイテムを含む新しいものではなく、に与えられた実際の参照渡すList<>DoSomethingことを意味します。これで問題がない場合は、修正してください。FrobinateList<>

于 2012-12-13T09:16:53.773 に答える
0

あなたの例ではinput、すでにタイプの要素で構成されているので、ReSharperは、フィルター条件が常に真であるため、IFrobableタイプでフィルターすることは意味がないと言います。呼び出しだけを使用するか、要素の購入をフィルターすることを提案します。IFrobableinput.ToList()nullinput.Where(element => element != null).ToList()

于 2016-01-29T11:25:07.583 に答える