C#LINQ-与方法组一起使用时是否选择过滤器空值?

C#LINQ-与方法组一起使用时是否选择过滤器空值?,c#,linq,resharper,method-group,C#,Linq,Resharper,Method Group,今天,我编写了一些代码,它获取a类实例列表,并使用静态工厂方法创建B类实例列表: public abstract class B { public static B CreateB(A a) { // return a new B instance or null if a B instance can't be created } } 我需要过滤掉空值,所以我使用LINQ来完成这两项任务: var bList = aList.Select(a =>

今天,我编写了一些代码,它获取a类实例列表,并使用静态工厂方法创建B类实例列表:

public abstract class B
{
    public static B CreateB(A a)
    {
        // return a new B instance or null if a B instance can't be created
    }
}
我需要过滤掉空值,所以我使用LINQ来完成这两项任务:

var bList = aList.Select(a => B.CreateB(a)).Where(b => b != null).ToList();
代码按预期运行,但我注意到Resharper在调用CreateB时建议我“转换为方法组”。我想知道这意味着什么,并在这个网站上找到了一些有趣的答案。例如: 这里还有Asad对stitty答案的评论(.Select(x=>transform(x))可以是.Select(transform))

因此,我将代码更改为:

var bList = aList.Select(B.CreateB).Where(b => b != null).ToList();
这也像预期的那样起作用,但现在我开始问我的问题。Resharper现在告诉我可以删除lambda表达式的位置,因为b!=null“始终为真”

我到处玩,而Resharper是正确的,但为什么呢?当我使用方法组时,Select()返回的集合为什么会有差异?当我使用一个方法组时,为什么Select()似乎会从集合中过滤掉空值?

Both
aList.Select(a=>B.CreateB(a)).Where(B=>B!=null.ToList()
aList.Select(B.CreateB).Where(B=>B!=null).ToList()使用与选择方法相同的重载

我使用LinqPad对其进行了测试,得到了以下输出:

因此,
Select
不会过滤任何内容。您正在使用哪个版本的Resharper和VisualStudio

VS2013上最新的ReSharper没有告诉任何事情:


出于好奇-静态方法如何创建B()'返回新的B实例'?它会创建一个继承的类实例吗?我知道这与你的问题无关,只是我以前从未见过这样的设计(而且我也不是专家)。你确定吗?我只是重建了你的例子,我没有得到任何关于删除
Where
子句的信息。@shay_uub是一个抽象类,CreateB()返回一个继承类的实例(或null)。@YuvalItzchakov好吧,Resharper没有说“删除Were子句”,它说的是关于B的“表达式总是正确的”空支票,我明白。但我也不明白。谢谢你的测试。我将VisualStudio 2012与Resharper 9.0更新1一起使用。结果表明这是Resharper中的一个bug。我调试了Where子句,将其更改为:.Where(item=>{return item!=null;}),而当Resharper说“表达式总是true”时,它实际上是false。请尝试升级到Resharper 9.1.1或9.2 EAP。如果仍然报告为错误,则为错误,应报告给