首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReferenceEquals与铸造挑战。转换为子类型使ReferenceEquals返回false

ReferenceEquals与铸造挑战。转换为子类型使ReferenceEquals返回false
EN

Stack Overflow用户
提问于 2021-12-28 10:39:43
回答 1查看 33关注 0票数 2

转换不复制对象。更具体地说,IEnumerable.Cast,根据资源,这是完全有意义的。但是,对于这个应用程序,找到小提琴,如果我将结束时的日志从Cast<BaseClass>更改为Cast<DerivedClass1>,引用等于是假的。检查主程序的日志。

are equal: True areEqualRef: True areEqualRef: False

张贴代码,以防万一,省略它,让我的观点玩弄小提琴:)

代码语言:javascript
复制
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();
        }
    }
}

更新:对这两种日志进行更新,以避免复制/粘贴

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-28 10:53:32

您需要从理论上分离正在进行比较的内容。当它说Enumerable.Cast<T>不复制对象时,它指的是序列中的各个对象。不是序列本身。为了执行必要的整形,从Cast<T>方法返回的序列是与原始序列不同的包装器/修饰器实例。

因为您在序列上使用了ReferenceEquals,这将报告false。但是,如果要比较序列中的每个对象(依次是对的),您会发现它们是相同的对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70505889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档