using System;
class Base
{
}
class Derived : Base
{
}
class DerivedAgain : Derived
{
}
class Program
{
static void Fun<T>(T arg)
{
Console.WriteLine("Fun<T>(T): " + arg);
}
static void Fun(Base arg)
{
Console.WriteLine("Fun(Base): " + arg);
}
static void Fun(Derived arg)
{
Console.WriteLine("Fun(Derived): " + arg);
}
public static void Main()
{
var b = new Base();
var d = new Derived();
Derived da = new DerivedAgain();
Fun("a string");
Fun(b);
Fun(d);
Fun(da);
}
}
dXNpbmcgU3lzdGVtOwoKY2xhc3MgQmFzZQp7Cn0KCmNsYXNzIERlcml2ZWQgOiBCYXNlCnsKfQoKY2xhc3MgRGVyaXZlZEFnYWluIDogRGVyaXZlZAp7Cn0KCmNsYXNzIFByb2dyYW0KewogICAgc3RhdGljIHZvaWQgRnVuPFQ+KFQgYXJnKQogICAgewogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGdW48VD4oVCk6ICIgKyBhcmcpOwogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCBGdW4oQmFzZSBhcmcpCiAgICB7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZ1bihCYXNlKTogIiArIGFyZyk7CiAgICB9CiAgICAKICAgIHN0YXRpYyB2b2lkIEZ1bihEZXJpdmVkIGFyZykKICAgIHsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRnVuKERlcml2ZWQpOiAiICsgYXJnKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIHZhciBiID0gbmV3IEJhc2UoKTsKICAgICAgICB2YXIgZCA9IG5ldyBEZXJpdmVkKCk7CiAgICAgICAgRGVyaXZlZCBkYSA9IG5ldyBEZXJpdmVkQWdhaW4oKTsKCiAgICAgICAgRnVuKCJhIHN0cmluZyIpOwogICAgICAgIEZ1bihiKTsKICAgICAgICBGdW4oZCk7CiAgICAgICAgRnVuKGRhKTsKICAgIH0KfQ==