gpt4 book ai didi

c# - 空合并运算符 IList、Array、Enumerable.foreach 中的 Empty

转载 作者:IT王子 更新时间:2023-10-29 04:31:02 28 4
gpt4 key购买 nike

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

它给了我:

Operator '??' cannot be applied to operands of type 'System.Collections.IList' and 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>不是吗?

最佳答案

当使用这个表达式时:

a ?? b

然后 b两者都必须与 a 的类型相同,或者它必须可以隐式转换为该类型,带有引用意味着它必须实现或继承任何类型 a是。

这些工作:

SomethingThatIsIListOfT ?? new T[0]
SomethingThatIsIListOfT ?? new T[] { }

因为T[] 一个IList<T> ,数组类型实现了该接口(interface)。

但是,这是行不通的:

SomethingThatIsIListOfT ?? SomethingThatImplementsIEnumerableOfT

因为表达式的类型将是 a类型,编译器显然无法保证 SomethingThatImplementsIEnumerableOfT还实现了 IList<T> .

您将不得不转换两个方面之一,以便您拥有兼容的类型:

(IEnumerable<T>)SomethingThatIsIListOfT ?? SomethingThatImplementsIEnumerableOfT

现在表达式的类型是IEnumerable<T>??运营商可以做它的事。


“表达式的类型将是 a 的类型”有点简化,规范全文如下:


表达式的类型 a ?? b取决于操作数上可用的隐式转换。按优先顺序,a ?? b 的类型是A0 , A , 或 B , 其中A是a的类型(前提是a有类型),Bb 的类型(前提是 b 有一个类型),并且 A0A 的基础类型如果A是可空类型,或 A否则。具体来说,a ?? b处理如下:

  • 如果A存在且不是可空类型或引用类型,则发生编译时错误。
  • 如果b是一个动态表达式,结果类型是动态的。在运行时,a首先被评估。如果a不是 null , a转换为动态类型,这成为结果。否则,b被评估,结果成为结果。
  • 否则,如果A存在并且是可空类型,并且存在从 b 的隐式转换至 A0 , 结果类型为 A0 .在运行时,a首先被评估。如果a不是 null , a展开以输入 A0 ,它变成了结果。否则,b被评估并转换为类型 A0 ,它变成了结果。
  • 否则,如果A存在并且存在从 b 的隐式转换至 A , 结果类型为 A .在运行时,a首先被评估。如果a不为空,a成为结果。否则,b被评估并转换为类型 A , 就变成了结果。
  • 否则,如果b有一个类型 B并且存在来自 a 的隐式转换至 B , 结果类型为 B .在运行时,a首先被评估。如果a不是 null , a展开以输入 A0 (如果 A 存在且可为空)并转换为类型 B ,它变成了结果。否则,b被评估并成为结果。
  • 否则,ab不兼容,并发生编译时错误。

关于c# - 空合并运算符 IList、Array、Enumerable.foreach 中的 Empty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52380876/

28 4 0