using System;
public class Test
{
// 2 наследника, в которых переопределяется невиртуальный метод
class Base { public void DoIt() { Console.WriteLine("Base"); } }
class A : Base { public new void DoIt() { Console.WriteLine("A"); } }
class B : Base { public new void DoIt() { Console.WriteLine("B"); } }
static void GenericTest<Smth>(Smth x) where Smth : Base
{
x.DoIt();
}
static void DynamicTest(dynamic x)
{
x.DoIt();
}
public static void Main()
{
Console.WriteLine("GenericTest");
GenericTest(new Base());
GenericTest(new A());
GenericTest(new B());
Console.WriteLine();
Console.WriteLine("DynamicTest");
DynamicTest(new Base());
DynamicTest(new A());
DynamicTest(new B());
Console.WriteLine();
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJLy8gMiDQvdCw0YHQu9C10LTQvdC40LrQsCwg0LIg0LrQvtGC0L7RgNGL0YUg0L/QtdGA0LXQvtC/0YDQtdC00LXQu9GP0LXRgtGB0Y8g0L3QtdCy0LjRgNGC0YPQsNC70YzQvdGL0Lkg0LzQtdGC0L7QtAoJY2xhc3MgQmFzZSAgICAgeyBwdWJsaWMgICAgIHZvaWQgRG9JdCgpIHsgQ29uc29sZS5Xcml0ZUxpbmUoIkJhc2UiKTsgfSB9CgljbGFzcyBBIDogQmFzZSB7IHB1YmxpYyBuZXcgdm9pZCBEb0l0KCkgeyBDb25zb2xlLldyaXRlTGluZSgiQSIpOyAgICB9IH0KCWNsYXNzIEIgOiBCYXNlIHsgcHVibGljIG5ldyB2b2lkIERvSXQoKSB7IENvbnNvbGUuV3JpdGVMaW5lKCJCIik7ICAgIH0gfQoJCglzdGF0aWMgdm9pZCBHZW5lcmljVGVzdDxTbXRoPihTbXRoIHgpIHdoZXJlIFNtdGggOiBCYXNlCgl7CgkJeC5Eb0l0KCk7Cgl9CgoJc3RhdGljIHZvaWQgRHluYW1pY1Rlc3QoZHluYW1pYyB4KQoJewoJCXguRG9JdCgpOwoJfQoKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlDb25zb2xlLldyaXRlTGluZSgiR2VuZXJpY1Rlc3QiKTsKCQlHZW5lcmljVGVzdChuZXcgQmFzZSgpKTsKCQlHZW5lcmljVGVzdChuZXcgQSgpKTsKCQlHZW5lcmljVGVzdChuZXcgQigpKTsKCQlDb25zb2xlLldyaXRlTGluZSgpOwoJCQoJCUNvbnNvbGUuV3JpdGVMaW5lKCJEeW5hbWljVGVzdCIpOwoJCUR5bmFtaWNUZXN0KG5ldyBCYXNlKCkpOwoJCUR5bmFtaWNUZXN0KG5ldyBBKCkpOwoJCUR5bmFtaWNUZXN0KG5ldyBCKCkpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Cgl9Cn0=