将IEnumerable转换为ICollection时会发生什么

Jam*_*xon 3 c# ienumerable casting icollection

鉴于以下情况:

var collection = myEnumerable as ICollection<MyType>;
Run Code Online (Sandbox Code Playgroud)

引擎盖下会发生什么?ICollection有一个伯爵财产.这个演员是否枚举了可枚举的计数或更多涉及的事情?

Dan*_*rth 8

什么都没发生.如果myEnumerable确实是一个ICollection<MyType> collection包含它.否则它会null.就那么简单.

  • `IEnumerable`不是`ICollection` - 它只会强制转换为`ICollection`并且如果你的实例实际上是一个已被下载到'IEnumerable`的`ICollection`,则会有计数 - 如果它不是你将得到null,那么这里没有神奇的转变. (4认同)
  • @JamieDixon:接口类型的存储位置不包含接口类型的实例(实际上,在与COM互操作相关的几个奇数情况之外,没有接口类型的实例).相反,它包含对实现接口的其他堆类型的对象的引用.请注意,每个值类型都有一个对应的堆类型,可以隐式转换它; 将实现接口的struct存储到该接口类型的存储位置将生成后一种类型的新堆对象,其公共和私有字段... (2认同)
  • ...加载了相应结构字段的内容.但是,将对象的引用存储到接口类型存储位置只会导致存储位置保存对已存在对象的引用.在这种情况下,将存储位置复制到某个其他类或接口类型之一将简单地导致后一个存储位置保持对同一对象的另一个引用. (2认同)