不应该在null变量上调用Enumerable.AsEnumerable()引发异常吗?

时间:2019-10-16 15:20:04

标签: c# linq

我有一段使用该表达式的代码-someCollection.AsEnumerable()。后来我意识到,在某些情况下,someCollection被设置为null。但是,我从未从此代码中获得任何例外。我什至通过调试器运行它。如果我没记错的话,如果someCollection.AsEnumerable()设置为null,则表达式someCollection的计算结果为null

如果将someCollection.AsEnumerable()设置为someCollection,是否应该调用null引发异常?我想念什么吗?

1 个答案:

答案 0 :(得分:5)

AsEnumerableextension method。定义为like this

public static class Enumerable
{
    public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source)
    {
        return source;
    }
}

null上调用扩展方法是有效的-编写someCollection.AsEnumerable()只是编写Enumerable.AsEnumerable(someCollection)的语法糖。如果您写了Enumerable.AsEnumerable(null)并得到了NullReferenceException,您会感到惊讶!

如您所见,null内没有AsEnumerable的测试-如果通过了null,它将只返回null


AsEnumerable可能被编写为包含对null-if (source == null) throw new ArgumentNullException(nameof(source));的显式测试(这将抛出ArgumentNullException,而不是NullReferenceException

但是,来自MSDN

  

AsEnumerable<TSource>(IEnumerable<TSource>)方法除了将源的编译时类型从实现IEnumerable<T>的类型本身更改为IEnumerable<T>之外,没有其他作用。

如果您将null键入为IQueryable<T>,我认为此方法将其转换为键入null的{​​{1}}是完全有效的。 IEnumerable<T>毕竟是完全有效的nullIEnumerable<T>

另一种看待这种情况的方式是,如果IQueryable<T>source,则抛出异常会得到什么?通过null的方法可以很好地工作,这可能对某人有用。