interface ICloneable<out T>
{
T Clone();
}
class Base : ICloneable<Base>
{
public Base Clone() { return new Base(); }
}
class Derived : Base, ICloneable<Derived>
{
new public Derived Clone() { return new Derived(); }
}
Учитывая эти объявления типов, какая часть спецификации С# объясняет, почему последняя строка следующего фрагмента кода печатает "True"? Могут ли разработчики полагаться на это поведение?
Derived d = new Derived();
Base b = d;
ICloneable<Base> cb = d;
Console.WriteLine(b.Clone() is Derived); // "False": Base.Clone() is called
Console.WriteLine(cb.Clone() is Derived); // "True": Derived.Clone() is called
Обратите внимание, что если параметр T
type в ICloneable
не был объявлен out
, то обе строки будут печатать "False".