所以我经常遇到这种情况...其中Do.Something(...)返回空集合,如下所示:

int[] returnArray = Do.Something(...);

然后,我try 这样使用这个集合:

foreach (int i in returnArray)
{
    // do some more stuff
}

我只是好奇,为什么foreach循环不能对空集合进行操作?在我看来,用空集合执行0次迭代似乎是合乎逻辑的...相反,它抛出了一个NullReferenceException.有人知道为什么会这样吗?

这很烦人,因为我使用的API并不清楚它们到底返回了什么,所以我最终到处都是if (someCollection != null)个……

Edit:感谢大家解释说,foreach使用GetEnumerator,如果没有枚举器可以获取,则foreach将失败.我猜我是在问,为什么语言/运行时不能或不会在获取枚举器之前执行NULL判断.在我看来,这种行为仍然会被很好地定义.

推荐答案

简而言之,答案是"因为编译器设计者就是这样设计的."但实际上,集合对象是空的,因此编译器无法让枚举器在集合中循环.

如果您确实需要执行这样的操作,请try 使用NULL合并操作符:

int[] array = null;

foreach (int i in array ?? Enumerable.Empty<int>())
{
   System.Console.WriteLine(string.Format("{0}", i));
}

.net相关问答推荐

获取Ef-Core集合的DeleteBehavior

在数据网格中:如何在更改单元格 A 中的值后显示单元格 B 中的更改

等待时 Blazor 服务器按钮刷新

在本地运行 Azure 函数会在 .NET7 升级后出现无运行时错误

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

为什么具有可为空值的 struct 的 HashSet 非常慢?

xunit Assert.ThrowsAsync() 不能正常工作?

在 ASP.NET MVC 中我可以在哪里放置自定义类?

.NET - WindowStyle = hidden 与 CreateNoWindow = true?

NonSerialized 属性

Int32.ToString() 是特定于文化的吗?

.NET 4.0 中有内置的二叉搜索树吗?

.NET 中工作线程和 I/O 线程的简单描述

如何找到 ManualResetEvent 的状态?

什么是编组?当某些东西被编组时会发生什么?

日期时间是什么意思?在 C# 中是什么意思?

将接收到的对象转换为 List 或 IEnumerable

在 C# 中将字符串转换为十六进制字符串

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

.NET 中的 java.lang.IllegalStateException?