【发布时间】:2019-02-22 03:41:15
【问题描述】:
在this question 我发现了以下内容:
int[] array = null;
foreach (int i in array ?? Enumerable.Empty<int>())
{
System.Console.WriteLine(string.Format("{0}", i));
}
和
int[] returnArray = Do.Something() ?? new int[] {};
和
... ?? new int[0]
在NotifyCollectionChangedEventHandler 中,我想像这样应用Enumerable.Empty:
foreach (DrawingPoint drawingPoint in e.OldItems ?? Enumerable.Empty<DrawingPoint>())
this.RemovePointMarker(drawingPoint);
注意: OldItems 属于这种类型 IList
它给了我:
运算符'??'不能应用于“System.Collections.IList”类型的操作数和
System.Collections.Generic.IEnumerable<DrawingPoint>
然而
foreach (DrawingPoint drawingPoint in e.OldItems ?? new int[0])
和
foreach (DrawingPoint drawingPoint in e.OldItems ?? new int[] {})
工作得很好。
为什么会这样?
为什么IList ?? T[] 有效而IList ?? IEnumerable<T> 无效?
【问题讨论】:
-
T[]是IList<T>,但不能保证实现IEnumerable<T>的对象实现IList<T>。您必须将IList<T>对象转换为IEnumerable<T>才能与?? Enumerable.Empty<T>一起使用。
标签: c# .net collections null-coalescing-operator