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

4

假设有这样一个案例:

var collection = myEnumerable as ICollection<MyType>;

在底层发生了什么? ICollection 有一个计数属性。这个转换是否枚举可枚举来获取计数,还是会发生更复杂的事情?

这个回答解决了你的问题吗?无法将IEnumerable<T>转换为ICollection<T> - Michael Freidgeim
嗨@MichaelFreidgeim。我差不多10年前问过这个问题。谢谢你的评论,但我不再有这个问题了。 - Jamie Dixon
抱歉自动生成了不必要的问题 - 该评论应该被理解为“可能是重复问题”。(https://meta.stackexchange.com/questions/339563/the-auto-comment-does-this-answer-your-question-generated-when-voting-to-clos) - Michael Freidgeim
2个回答

9

没有任何反应。如果myEnumerable确实是一个ICollection<MyType>,那么collection将包含它。否则,它将为null。就这么简单。


1
谢谢丹尼尔。ICollection上的count属性是如何设置的? - Jamie Dixon
它已经存在了。它不会被设置。强制转换不会创建新的实例! - Daniel Hilgarth
4
IEnumerable 不等同于 ICollection,它只会转换成 ICollection 并计算元素数量,如果您的实例实际上是一个已经向下转换为 IEnumerableICollection,否则将返回 null,这里没有任何神奇的转换。 - Richard Friend
2
@JamieDixon:一个接口类型的存储位置并不持有接口类型的实例(实际上,在与 COM 互操作相关的少数奇怪情况之外,不存在接口类型的实例)。相反,它持有对实现接口的某个其他堆类型对象的引用。请注意,每种值类型都有相应的堆类型,可以隐式转换为该堆类型;将实现接口的结构体存储到该接口类型的存储位置中将生成后者类型的新堆对象,其公共和私有字段... - supercat
2
将相应结构字段的内容加载到变量中。然而,将堆对象的引用存储到接口类型的存储位置中只会导致该存储位置保存对已存在对象的引用。在这种情况下,将存储位置复制到其他某个类或接口类型中只会导致后者存储位置保存对同一对象的另一个引用。 - supercat
显示剩余3条评论

1

重要提示:

无论何时,当您将 IEnumerable 类型对象转换为 ICollection 时,它将成为引用类型。

例如,从集合中删除项目也会从 IEnumerable 集合中删除该项目。

例如:

IEnumerable<AnyClass> enumerableObject;

ICollection<AyClass> collectingObject = (ICollection<AnyClass>)enumerableObject;

foreach(var item in collectingObject){

collectingObject.Remove(item);

}

如果您访问enumerableObject的值,您会发现它已更新,并且所有值都已删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接