- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在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
有类型),B
是 b
的类型(前提是 b
有一个类型),并且 A0
是 A
的基础类型如果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
被评估并成为结果。a
和 b
不兼容,并发生编译时错误。关于c# - 空合并运算符 IList、Array、Enumerable.foreach 中的 Empty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52380876/
我正在尝试转换 IList>至 IList ,我的意思是有一个唯一的列表,其中包含第一个的所有元素(对象)。 public IList> PMTs { get
在 C# 中,如果我有一个 IList,但我不知道 IList 中对象的类型,我该如何创建一个 的副本>IList? 情况是这样的: 我有一个 CollectionEditor,它可以修改 IList
IList不继承 IList其中 IEnumerable继承IEnumerable . 如果out修饰符是大多数执行 IList 的唯一原因(例如 Collection , List )实现 ILis
尝试过: IList> matrix = new List()>(); 可是我做不到。我该怎么做?我需要一个字符串矩阵... 最佳答案 你需要: IList> matrix = new List>()
我有一个构建列表列表的方法。我想让返回类型使用通用 IList<> 接口(interface)来减少与下游具体 List<> 类型的耦合。但是,编译器在类型转换方面遇到了困难。 public ILis
我有一个 IList我想将此集合复制到 IList收藏 我试过这个: IList listAdminVAT = new AdministrationService(session).ListDecim
我有一个实现了 IList 的对象接口(interface),我想把它转换成IList或者 List ,我试过了 IList a=(IList)b; List a=(IList)b; IList a=
我似乎无法弄清楚为什么以下内容不起作用。 通过阅读,它似乎一定与 this 之类的东西有某种关联。 . public class Test { public void SomeFunction
我有几个类: class Vehicle { } class Car : Vehicle { } 我有一个派生类的列表: IList cars; 我想将列表转换为其基类,并尝试过: IList bas
List的定义在 .net 中显示它实现了各种接口(interface)。 public class List : IList, ICollection, IEnumerable, IList, IC
我想创建一个 ListCollectionView使用通用 IList但是构造函数得到一个非泛型 IList .如何将我的列表从 IList 转换为至 IList ? 如果有另一种方法可以创建 Lis
这个问题在这里已经有了答案: Remove items from one list in another (10 个答案) 关闭 8 年前。 很抱歉提出这样的基本问题,我是 LINQ 的新手,我正试
我正在实现 IListSource这需要一个方法 GetList()具有以下签名: IList GetList() 我正在使用 .NET Framework 2,我想返回一个实现 IList 的对象,
我有一个类(class)想要 IList , 但我有一个 Systems.Collection.IList , 来自 NHibernate 问题。 我想创建一个将其转换为 IList 的方法.我该怎么
我似乎找不到为我的 MVVM Xamarin 表单应用程序构建和使用数据的最佳实践或最佳机制。这可能是对如何解决问题的简单误解,但我不确定。 我曾尝试使用 IEnumerable、IList 和一个简
多年来,我们大部分时间都在使用泛型集合。有时我们确实需要任何东西的集合(好吧,通常只有一些不同的东西但没有公共(public)基类)。对于这种情况,我们可以使用 IList或通用 IList作为方法参
我有一个 IList目的。 Person 类有字段,FirstName , LastName等 我有一个函数需要 IList我想以与 IList 相同的顺序传入 FirstNames 列表目的。有没有
尝试这样转换 Products1 = (IList)basicProfile.Products2.Select(ToProductInfo) Products1 是一个 public IList Pr
我正在尝试创建一个列表列表,但在实例化列表时遇到了问题。 IList> allLists = List>(); 我遇到了这一行的编译错误。 最佳答案 你必须实例化一个 List的 IList , 不是
我有一个集合,它实现了一个扩展 IList 和 List 的接口(interface)。 public Interface IMySpecialCollection : IList, IList {
我是一名优秀的程序员,十分优秀!