вместо

interface IBase
{
    string Name { get; }
}

class Base : IBase
{
    public Base() => this.Name = "Base";
    public string Name { get; }
}

class Derived : Base//, IBase
{
    public Derived() => this.Name = "Derived";
    public new string Name { get; }
}


class Program
{
    static void Main(string[] args)
    {
        IBase o = new Derived();
        Console.WriteLine(o.Name);
    }
}

м случае выводом будет «База».

Если я прямо заявляю, что Derived реализует IBase (который на самом деле уже реализован базовым классом Base, и такие аннотации кажутся бесполезными), вывод будет "Derived"

class Derived : Base, IBase
{
    public Derived() => this.Name = "Derived";
    public new string Name { get; }
}

В чем причина такого поведения?

VS 15.3.5, C # 7

Ответы на вопрос(2)

Ваш ответ на вопрос