C# 已强制转换为派生类型的多态对象是否具有相同的引用值

C# 已强制转换为派生类型的多态对象是否具有相同的引用值,c#,polymorphism,C#,Polymorphism,假设我有: class Foo { } class Bar : Foo { } 类型为Bar的实例化对象称为polly,它是列表的成员,将List.Contains(polly)返回true,还是false 其次,当对象被称为基类和派生类时,对象是否保持相同的引用?向下或向上转换不会更改引用和内存地址。它只是改变了编译器允许您与该对象交互的方式 > string fooString = "test"; ; > object fooObject = fooString; >

假设我有:

class Foo { }

class Bar : Foo { }
类型为
Bar
的实例化对象称为
polly
,它是
列表的成员,将
List.Contains(polly)
返回true,还是false


其次,当对象被称为基类和派生类时,对象是否保持相同的引用?

向下或向上转换不会更改引用和内存地址。它只是改变了编译器允许您与该对象交互的方式

> string fooString = "test"; ;
> object fooObject = fooString;
> bool areSameReference = object.ReferenceEquals(fooString, fooObject);
> areSameReference
true
所以第二个问题的答案是肯定的


第一个问题也是肯定的,假设
Foo
没有实现自定义比较逻辑,因为
List.Contains
使用
EqualityComparer.Default
,只有在没有其他可能的情况下才会回退到
ObjectEqualityComparer
和基于引用的比较。

向下或向上转换不会更改引用和内存地址。它只是改变了编译器允许您与该对象交互的方式

> string fooString = "test"; ;
> object fooObject = fooString;
> bool areSameReference = object.ReferenceEquals(fooString, fooObject);
> areSameReference
true
所以第二个问题的答案是肯定的


第一个问题也是肯定的,假设
Foo
不实现自定义比较逻辑,因为
List.Contains
使用
EqualityComparer.Default
,它将回退到
ObjectEqualityComparer
和基于引用的比较,只有在没有其他可能的情况下。

不会导致同一引用的相等。如果类实现的自定义比较不会导致同一引用的相等,这将是非常糟糕的。