// Compiler options: -langversion:default
// Test for covariance support in delegates
//

using System;

 public class A {
	 protected string name;
	 
	 public A (string name)
	 {
		 this.name = "A::" + name;
	 }

	 public A ()
	 {
	 }

	 public string Name {
		 get {
			 return name;
		 }
	 }
 }

 public class B : A {
	 public B (string name)
	 {
		 this.name = "B::" + name;
	 }

	 public B ()
	 {
	 }
 }

 public class C : B {
	 public C (string name)
	 {
		 this.name = "C::" + name;
	 }
 }

 public class Tester {

	 delegate A MethodHandler (string name);

	 static A MethodSampleA (string name)
	 {
		 return new A (name);
	 }

	 static B MethodSampleB (string name)
	 {
		 return new B (name);
	 }

	 static C MethodSampleC (string name)
	 {
		 return new C (name);
	 }

	 public static void Main ()
	 {
		 MethodHandler a = MethodSampleA;
		 MethodHandler b = MethodSampleB;
		 MethodHandler c = MethodSampleC;

		 A instance1 = a ("Hello");
		 A instance2 = b ("World");
		 A instance3 = c ("!");

		 Console.WriteLine (instance1.Name);
		 Console.WriteLine (instance2.Name);
		 Console.WriteLine (instance3.Name);
	 }
	
 }