IDa*_*der 22 .net c# collections null-coalescing-operator
在这个问题中,我发现了以下内容:
int[] array = null;
foreach (int i in array ?? Enumerable.Empty<int>())
{
System.Console.WriteLine(string.Format("{0}", i));
}
Run Code Online (Sandbox Code Playgroud)
和
int[] returnArray = Do.Something() ?? new int[] {};
Run Code Online (Sandbox Code Playgroud)
和
... ?? new int[0]
Run Code Online (Sandbox Code Playgroud)
在一个NotifyCollectionChangedEventHandler
我想申请Enumerable.Empty
如此:
foreach (DrawingPoint drawingPoint in e.OldItems ?? Enumerable.Empty<DrawingPoint>())
this.RemovePointMarker(drawingPoint);
Run Code Online (Sandbox Code Playgroud)
注意: OldItems
属于该类型 IList
它给了我:
接线员'??' 不能应用于'System.Collections.IList'类型的操作数
System.Collections.Generic.IEnumerable<DrawingPoint>
然而
foreach (DrawingPoint drawingPoint in e.OldItems ?? new int[0])
Run Code Online (Sandbox Code Playgroud)
和
foreach (DrawingPoint drawingPoint in e.OldItems ?? new int[] {})
Run Code Online (Sandbox Code Playgroud)
工作得很好.
这是为什么?
为什么IList ?? T[]
工作但IList ?? IEnumerable<T>
不工作?
ang*_*son 20
使用此表达式时:
a ?? b
Run Code Online (Sandbox Code Playgroud)
然后b
要么必须是相同的类型a
,要么必须隐式地转换为该类型,带引用意味着它必须实现或继承任何类型a
.
这些工作:
SomethingThatIsIListOfT ?? new T[0]
SomethingThatIsIListOfT ?? new T[] { }
Run Code Online (Sandbox Code Playgroud)
因为T[]
是一个IList<T>
,阵列类型实现该接口.
但是,这不起作用:
SomethingThatIsIListOfT ?? SomethingThatImplementsIEnumerableOfT
Run Code Online (Sandbox Code Playgroud)
因为表达式的a
类型将是类型,并且编译器显然无法保证SomethingThatImplementsIEnumerableOfT
也实现IList<T>
.
你将不得不施放两个中的一个,以便你有兼容的类型:
(IEnumerable<T>)SomethingThatIsIListOfT ?? SomethingThatImplementsIEnumerableOfT
Run Code Online (Sandbox Code Playgroud)
现在表达式的类型是IEnumerable<T>
,??
操作员可以做它的事情.
"表达式的类型将是类型a
"有点简化,规范中的全文如下:
表达式的类型a ?? b
取决于操作数上可用的隐式转换.按优先顺序,类型a ?? b
是A0
,A
或,或者B
,A
a的类型(如果a
有类型),B
是b
(提供b
有类型)的类型,并且if 是可空类型A0
的基础类型或者其他.具体来说,处理如下: A
A
A
a ?? b
A
存在且不是可空类型或引用类型,则发生编译时错误.b
是动态表达式,则结果类型是动态的.在运行时,a
首先进行评估.如果a
不是null
,a
则转换为动态类型,这就成了结果.否则,b
进行评估,结果成为结果.A
存在并且是可空类型并且存在来自b
to 的隐式转换A0
,则结果类型为A0
.在运行时,a
首先进行评估.如果a
不是null
,a
则打开包装A0
,它就成了结果.否则,b
将进行评估并转换为类型A0
,并将其作为结果.A
存在且存在来自b
to 的隐式转换A
,则结果类型为A
.在运行时,a
首先进行评估.如果a
不为null,则a
成为结果.否则,b
将进行评估并转换为类型A
,并将其作为结果.b
存在类型B
并且存在来自a
to 的隐式转换B
,则结果类型为B
.在运行时,a
首先进行评估.如果a
不是null
,a
则解包为键入A0
(如果A
存在并且可以为空)并转换为类型B
,并且它将成为结果.否则,b
评估并成为结果.a
并且b
不兼容,并发生编译时错误. 归档时间: |
|
查看次数: |
1095 次 |
最近记录: |