冗余的 'IEnumerable.OfType<T>' 调用,考虑与 'null' 进行比较。

3

我从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个回答

3

这是一个普通的函数调用:

Enumerable.OfType<IFrobable>(input)

这是相同的函数,但作为扩展方法调用:

input.OfType<IFrobable>()

在您的情况下:
Frobinate(input);

完全没问题,因为:

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

等于:

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

在你的方法中,input 已经被定义为 List<IFrobable>,那这样做的意义在哪里呢?

关于您上一个问题的回答:在过去的某个时候,输入是IFrobableEx(public interface IFrobableEx:IFrobable),而其中一位开发人员热衷于显式转换。 - Dan Is Fiddling By Firelight

2

你最后的案例可能会引入逻辑错误。

你是真的想让Frobinate有能力修改传递到DoSomethinginput列表,还是只是这些引用的副本?


好问题。在过去的某个时候,确实进行了真正的转换,并且当时需要使用ToList();但是是否创建副本是期望的副作用并不明显。 - Dan Is Fiddling By Firelight

1
    //Suggested change from ReSharper

实际上,在Enumerable上调用OfType作为静态方法,而不是在input上作为扩展方法调用,这不是ReSharper的一个建议 - 它是一个上下文操作。我在这篇文章中详细阐述了区别。

关于实际问题:

检查

冗余的'IEnumerable.OfType<T>'调用。考虑与'null'进行比较

这并不是ReSharper提供的一个快速解决方案,我想这是因为没有一个单一明确的“正确”更改。它只是说

嘿,input中的所有内容肯定是类型为IFrobable的 - 如果你试图过滤这个列表,你可能意味着要通过nullness进行过滤

这在你的情况下可能不相关。

关于您提出的修复方案 - 如已经注意到的那样,这将意味着将给定给DoSomething实际List<>引用传递给Frobinate,而不是包含相同项的新List<> - 如果可以接受,请继续。

0
在你的例子中,你有一个input,它已经包含了类型为IFrobable的元素,所以ReSharper说按照类型IFrobable过滤它们没有意义,因为过滤条件总是为真。它建议你使用input.ToList()调用或者通过null性来过滤元素:input.Where(element => element != null).ToList()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接