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
和基于引用的比较,只有在没有其他可能的情况下。不会导致同一引用的相等。如果类实现的自定义比较不会导致同一引用的相等,这将是非常糟糕的。