我有一段使用该表达式的代码-someCollection.AsEnumerable()
。后来我意识到,在某些情况下,someCollection
被设置为null
。但是,我从未从此代码中获得任何例外。我什至通过调试器运行它。如果我没记错的话,如果someCollection.AsEnumerable()
设置为null
,则表达式someCollection
的计算结果为null
。
如果将someCollection.AsEnumerable()
设置为someCollection
,是否应该调用null
引发异常?我想念什么吗?
答案 0 :(得分:5)
AsEnumerable
是extension 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>
毕竟是完全有效的null
和IEnumerable<T>
。
另一种看待这种情况的方式是,如果IQueryable<T>
为source
,则抛出异常会得到什么?通过null
的方法可以很好地工作,这可能对某人有用。