问题描述
|
这个问题已经在这里有了答案:
解决方法
如果在LINQ中调用的集合为空,则Microsoft抛出ArgumentNullException。这实际上更多的是样式问题,但与扩展方法的行为方式一致。
@ m0sa是正确的,尽管您将从您的foreach中获得一个空引用,但是我会说要检查top并抛出ArgumentNullException。这样,您将与LINQ的功能相提并论。
例如,如果您在反编译器中查看Any(),则会看到:
public static bool Any<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull(\"source\");
}
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return true;
}
}
return false;
}
, 绝对应该执行null
检查并抛出ArgumentNullException
,以避免在代码内部难以理解NullReferenceExceptions
。
通常,我会避免将ѭ1视为en \“ empty \”IEnumerable<T>
。只是使用Enumerable.Empty<T>()
来避免null
集合的特殊情况。
如果您决定在扩展方法中进行“ 1”检查,则应考虑“急切地”进行。如果在扩展方法中使用yield return
,直到迭代开始之前,实际上不会评估它。您将扩展方法分为两部分。检查参数的\“ eager \”部分和yield return
元素的\“ lazy \”。
, 首先:我很确定如果ѭ12等于ѭ1,将会有ѭ11。因此,您的那部分问题根本没有问题。关于其余部分:通过检查ѭ1并抛出不同的异常,您有任何收获吗?我认为:不!因此,我不会因根本没有帮助的检查而使代码混乱。
, 如果集合参数为null
,我将抛出throw11ѭ。这是从思考如果它是null
时的行为会发生什么,而ѭ18just恰好只是一种常规方法-我期望会抛出NullReferenceException
。
编辑:
根据马丁的评论和对此的进一步研究,我收回了我所说的话。在这种情况下,似乎不应该抛出“ 11”,因为微软建议改用“ 2”。