IEnumerable null合并扩展

在经过foreach或LINQ查询迭代之前,我经常面临检查IEnumerable是否为null的问题,然后我经常会遇到这样的代码:

 var myProjection = (myList ?? Enumerable.Empty()).Select(x => x.Foo)... 

因此,我想将此扩展方法添加到Extensions类:

 public static class MyExtensions { public static IEnumerable AsEmptyIfNull(this IEnumerable source) { return source ?? Enumerable.Empty(); } } 

在我看来这个代码时会立即出现一个小问题,即,考虑到扩展方法的“实例方法方面” ,它应该仅仅作为一个静态方法来实现,否则这样的东西是完全合法的:

 IEnumerable list = null; list.AsEmptyIfNull(); 

你看到使用它有任何其他缺点吗?
如果大量使用,这种扩展会导致开发人员出现某种不良趋势吗?


奖金问题:

你能建议一个更好的名字吗? :)
(英语不是我的第一语言,那么我在命名方面不太好…)

提前致谢。

返回IEnumerable应该返回一个空的,而不是null。 所以你不需要这个。

看到这个问题: 返回null或空集合是否更好?

否则,您的代码似乎没问题。

如果可以控制它,返回null而不是空序列通常是个坏主意。 如果您考虑到有人被要求生成一个集合时,这是不言自明的,返回null并不像是说“集合是空的”,而是“根本没有这样的集合”。

如果你拥有返回枚举的方法,那么返回一个空的IEnumerable (它甚至可以是一个特殊用途的只读静态对象,如果它可能会被大量返回)是要走的路,期间。

如果你被迫使用一个习惯在这种情况下返回null的坏人库,那么这个扩展方法可能是一个解决方案,但我再也不喜欢它了。 在你自己的版本中包含坏人方法可能会更好,这些方法会在人们看不到它的情况下进行合并。 通过这种方式,您可以获得始终具有可枚举而非null的便利性以及不支持“return null”范例的正确性。