转换不复制对象。更具体地说,IEnumerable.Cast,根据这资源,这是完全有意义的。但是,对于这个应用程序,找到小提琴,如果我将结束时的日志从Cast<BaseClass>更改为Cast<DerivedClass1>,引用等于是假的。检查主程序的日志。
are equal: True areEqualRef: True areEqualRef: False
张贴代码,以防万一,省略它,让我的观点玩弄小提琴:)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp17
{
public class BaseClass {
string name = "I am base";
public Type type;
public enum Type {
a,b,c,d
}
public BaseClass(Type type) {
this.type = type;
}
}
public class DerivedClass1 : BaseClass
{
string name = "I am derivedA";
public DerivedClass1(): base(Type.a) {
}
}
public class DerivedClass2 : BaseClass
{
string name = "I am derivedB";
public DerivedClass2() : base(Type.b)
{
}
}
public class Foo
{
public Dictionary<BaseClass.Type, List<BaseClass>> dict = new Dictionary<BaseClass.Type, List<BaseClass>>();
public Foo() {
dict[BaseClass.Type.a] = new List<BaseClass>();
dict[BaseClass.Type.b] = new List<BaseClass>();
dict[BaseClass.Type.c] = new List<BaseClass>();
dict[BaseClass.Type.d] = new List<BaseClass>();
AddItem(new DerivedClass1());
AddItem(new DerivedClass1());
AddItem(new DerivedClass2());
AddItem(new DerivedClass2());
AddItem(new DerivedClass2());
}
public IEnumerable<T> GetEnumByType<T>(BaseClass.Type type) where T : BaseClass
{
if (dict.ContainsKey(type))
{
if (type == BaseClass.Type.a)
{
Console.WriteLine($"are equal: { object.ReferenceEquals(dict[type].Cast<T>(), dict[BaseClass.Type.a])}");
}
return dict[type].Cast<T>();
}
return null;
}
public void AddItem<T>(T item) where T : BaseClass
{
dict[item.type].Add(item);
}
}
class Program
{
static void Main(string[] args)
{
Foo foo = new Foo();
IEnumerable myList = foo.GetEnumByType<BaseClass>(BaseClass.Type.a);
Console.WriteLine($"areEqualRef: {object.ReferenceEquals(foo.dict[BaseClass.Type.a].Cast<BaseClass>(), foo.dict[BaseClass.Type.a])}");
Console.ReadLine();
}
}
}更新:对这两种日志进行更新,以避免复制/粘贴
发布于 2021-12-28 10:53:32
您需要从理论上分离正在进行比较的内容。当它说Enumerable.Cast<T>不复制对象时,它指的是序列中的各个对象。不是序列本身。为了执行必要的整形,从Cast<T>方法返回的序列是与原始序列不同的包装器/修饰器实例。
因为您在序列上使用了ReferenceEquals,这将报告false。但是,如果要比较序列中的每个对象(依次是对的),您会发现它们是相同的对象。
https://stackoverflow.com/questions/70505889
复制相似问题