是否可枚举.Cast<;T>;复制对象
本文关键字:复制 对象 gt lt 枚举 Cast 是否 | 更新日期: 2023-09-27 18:24:00
我有一个对象层次结构
public class MyBase {}
public class MyDerived : MyBase {}
并具有
List<MyBase> myList;
实际上充满了MyDerived
的实例
为了作为List<MyDerived>
访问该列表,我正在执行以下操作:
myList.Cast<MyDerived>().ToList()
我阅读了关于Enumerable.Cast<T>
的MSDN文档,但我不清楚Cast<T>
和ToList
操作是对内存中的对象进行新的复制,还是只是允许编译器访问现有对象,就好像它们是List<MyDerived>
一样。
顾名思义,Cast<T>()
只是投射对象:
public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) {
IEnumerable<TResult> typedSource = source as IEnumerable<TResult>;
if (typedSource != null) return typedSource;
if (source == null) throw Error.ArgumentNull("source");
return CastIterator<TResult>(source);
}
static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) {
foreach (object obj in source) yield return (TResult)obj;
}
在.Net中,根本不可能复制任意对象。Cast<T>()
复制东西是没有意义的。
注意,如果T
是值类型,Cast<T>()
将复制结构;值类型总是被复制。(作为ref
参数传递时除外)
无
毫不奇怪(!)它Casts
他们。
我阅读了关于Enumerable.Cast的MSDN文档,但我不清楚Cast和ToList操作是在内存中创建对象的新副本,还是只是允许编译器访问现有对象,就像访问List一样。
是的,特别是这个场景将允许编译器访问现有对象,就好像它们是List<MyDerived>
一样
强制转换调用:
enumerable.Cast<T>();
相当于:
enumerable.Select(x=>(T)x)
和:
enumerable.ToList<T>()
相当于:
List<T> myList = new List<T>();
foreach(T item in enumerable)
{
myList.Add(item);
}
所以。。。
enumerable.Cast<T2>.ToList()
相当于:
List<T2> myList = new List<T2>();
foreach(T item in enumerable)
{
myList.Add((T2)item);
}
如果enumerable包含任何类型不可转换为T2的条目,则这两个条目都会立即爆炸。
它会更安全作为
enumerable.Where(x=>x is T2).Cast<T2>().ToList();
或
enumerable.OfType<T2>().ToList();
但是,这些都不会复制原始集合中包含的对象。它们只是创建包含对原始对象的引用的集合。