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

C# LINQ - Does Select filter nulls when used with a method group?

今天我写了一些代码,使用静态工厂方法获取 class 个 A 实例列表并创建 class 个 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 时,我应该 "Convert to method group"。我想知道这意味着什么,并在这个网站上找到了一些有趣的答案。例如: What is a method group in C#? and a comment by Asad to stitty's answer here Filtering Null values in Select (.Select(x => transform(x)) 可以是 .Select(transform))

所以我将代码更改为:

var bList = aList.Select(B.CreateB).Where(b => b != null).ToList();

这也按预期工作,但现在我开始回答我的问题了。 Resharper 现在告诉我可以删除 Where lambda 表达式,因为 b != null "is always true".

我试了一下,Resharper 是正确的,但为什么呢?为什么使用方法组时 Select() 的返回集合有差异?为什么 Select() 在我使用方法组时似乎从集合中过滤掉了空值?

aList.Select(a => B.CreateB(a)).Where(b => b != null).ToList();aList.Select(B.CreateB).Where(b => b != null).ToList(); 都使用相同的 Select 方法重载。

我用 LinqPad 测试了它并得到了以下输出:

所以 Select 不过滤任何东西。您使用的是什么版本的 Resharper 和 VisualStudio?

VS2013 上的最新 ReSharper 没有说明任何问题: