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能够修改input传入的列表DoSomething还是这些引用的副本?

于 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作为静态方法调用Enumerable而不是作为扩展方法调用input不是ReSharper的建议- 这是一个上下文操作我在这篇文章中阐述了不同之处。

对于实际问题:

检验

冗余 ' IEnumerable.OfType<T>' 呼叫。考虑与 ' null'进行比较

不是 ReSharper 提供快速修复解决方案的解决方案,我猜是因为没有一个明确的“正确”更改要做。这只是说

嘿,里面的所有东西肯定input都是类型的——如果你想过滤这个列表,你可能想用ness过滤IFrobablenull

这可能与您的情况无关。

至于您提出的修复 - 正如已经指出的那样,这将意味着传递给的实际List<>引用DoSomethingFrobinate,而不是包含相同项目的新List<>引用- 如果可以,那就去吧。

于 2012-12-13T09:16:53.773 回答
0

在您的示例中,您input已经包含类型元素,IFrobable因此 ReSharper 说按类型过滤它们没有意义,IFrobable因为过滤条件始终为真,它建议您仅使用input.ToList()调用或过滤元素购买nullinput.Where(element => element != null).ToList()

于 2016-01-29T11:25:07.583 回答