设计选择:“ToArray()”LINQ扩展是否有足够的理由为空集合引发异常?

设计选择:“ToArray()”LINQ扩展是否有足够的理由为空集合引发异常?,linq,Linq,毫不奇怪,下面的代码将抛出ArgumentNullException 乍一看,这很明显。。。但是,有人认为返回null可能是一种合理的替代方法,ToArray是一种扩展方法,因此即使在null上也可以调用,这并不是不连贯的 虽然我承认,通过这种方式,扩展的行为就像一个真正的方法,但我还是情不自禁地发现另一种方法也非常聪明。。。但这可能会导致其他问题?为什么要将错误推到代码中的其他位置?如果您希望某些内容可以为空,请在使用前检查它。否则,在假设错误的地方抛出一个错误,即当您试图将其转换为数组时 我

毫不奇怪,下面的代码将抛出ArgumentNullException

乍一看,这很明显。。。但是,有人认为返回null可能是一种合理的替代方法,ToArray是一种扩展方法,因此即使在null上也可以调用,这并不是不连贯的


虽然我承认,通过这种方式,扩展的行为就像一个真正的方法,但我还是情不自禁地发现另一种方法也非常聪明。。。但这可能会导致其他问题?

为什么要将错误推到代码中的其他位置?如果您希望某些内容可以为空,请在使用前检查它。否则,在假设错误的地方抛出一个错误,即当您试图将其转换为数组时


我知道在链接操作时可能会有争议,但在这种情况下,我发现使用空IEnumerable比使用空IEnumerable更容易。

为什么要将错误推到代码中的其他位置?如果您希望某些内容可以为空,请在使用前检查它。否则,在假设错误的地方抛出一个错误,即当您试图将其转换为数组时

我知道链接操作时可能会有争议,但在这种情况下,我发现使用空IEnumerable比使用空IEnumerable更容易。

授予IEnumerable是集合中使用的接口,但底层实现是对象,并且您已将集合变量设置为指向空,因此有例外

另一方面,如果您使用以下命令初始化集合:

您将有一个可以操作的空列表对象。引发ArgumentNullException异常是因为集合参数实际上为null,而ToArray正试图对其执行操作。所以从逻辑上讲,对我来说,这是唯一的设计选择

编辑

另一方面,在实践中,当类方法上的返回类型应该返回IEnumerable时,我有意识地决定始终返回有效的IEnumerable

比如,;一个看起来像IEnumerable GetAll的方法签名将始终返回一个有效的可枚举项,如果没有可返回的内容,那么我将返回enumerable.Empty

对我来说,这里的区别在于GetAll不是对集合参数执行操作。您可以将此视为集合实际上只不过是方法的一个参数,如果将null参数传递给常规方法,则可能会引发ArgumentNullException

简而言之,您的集合变量是ToArray方法的预期参数或参数,它为null,因此抛出ArgumentNullException是有意义的。

授予IEnumerable是集合中使用的接口,但底层实现是一个对象,您已将该集合变量设置为指向null,因此有例外

另一方面,如果您使用以下命令初始化集合:

您将有一个可以操作的空列表对象。引发ArgumentNullException异常是因为集合参数实际上为null,而ToArray正试图对其执行操作。所以从逻辑上讲,对我来说,这是唯一的设计选择

编辑

另一方面,在实践中,当类方法上的返回类型应该返回IEnumerable时,我有意识地决定始终返回有效的IEnumerable

比如,;一个看起来像IEnumerable GetAll的方法签名将始终返回一个有效的可枚举项,如果没有可返回的内容,那么我将返回enumerable.Empty

对我来说,这里的区别在于GetAll不是对集合参数执行操作。您可以将此视为集合实际上只不过是方法的一个参数,如果将null参数传递给常规方法,则可能会引发ArgumentNullException


简而言之,您的集合变量是ToArray方法的预期参数或参数,它为null,因此抛出ArgumentNullException是有意义的。

谢谢@Ron和@Craig。我喜欢错误必须在准确的位置提出的论点。别担心,我只是在一系列的行动中遇到了这种情况,有一段时间想知道宣传是否明智。当然,这要看情况而定,但在准确的地点提高是一个足够有力的论点。谢谢@Ron和@Craig。我喜欢错误必须在准确的位置提出的论点。别担心,我只是在一系列的行动中遇到了这种情况,有一段时间想知道宣传是否明智。当然,这取决于具体情况,但在确切的地点提出是一个足够有力的论点。
IEnumerable<string> collection = null;
string[] collectionViewAsAnArray = collection.ToArray();
IEnumerable<string> collection = Enumerable.Empty<string>();
IEnumerable<string> collection = new List<string>();