是否可枚举.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>;复制对象

顾名思义,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();

但是,这些都不会复制原始集合中包含的对象。它们只是创建包含对原始对象的引用的集合。