1.协变。
以下委托将定义为具有Human返回类型的委托,而实例化委托的方法中有一个返回类型是Women类型的。Women类型是由Human类型派生的。
class Human
{
public override string ToString()
{
return "human";
}
}
class Women : Humen
{
public override string ToString()
{
return "women";
}
}
class Program
{
/// <summary>
/// 定义一个返回类型为Human的委托。
/// </summary>
/// <returns>返回一个Human对象。</returns>
public delegate Human GetHumanHandler(bool isWomen);
public static Human GetHuman(bool isWomen)
{
Human human;
if (isWomen)
{
human = new Women();
Console.WriteLine(human);
return human;
}
human = new Human();
Console.WriteLine(human);
return human;
}
public static Human GetWomen()
{
Women human = new Women();
Console.WriteLine(human);
return human;
}
static void Main(string[] args)
{
//命名方法
GetHumanHandler handler1 = GetHuman;
//匿名方法
GetHumanHandler handler2 = delegate
{
return GetWomen();
};
handler1.Invoke(false);
handler2.Invoke(true);
}
}
2.逆变
以下委托将定义为一个带有Human类型参数的委托何一个带有Women类型参数的委托。Women类型是由Human类型派生的。而实例化委托的方法中只
是一个带有Human类型参数的方法。两个委托共用一个方法实例。
class Human
{
}
class Women : Human
{
}
class Program
{
public delegate void HumanInfoPrintHandler(Human human);
public delegate void WomenInfoPrintHandler(Women human);
public static void HumanInfoPrint(Human human)
{
if (human is Women)
{
Console.WriteLine("women");
}
else
{
Console.WriteLine("human");
}
}
static void Main(string[] args)
{
HumanInfoPrintHandler handler1 = HumanInfoPrint;
WomenInfoPrintHandler handler2 = HumanInfoPrint;
handler1.Invoke(new Human());
handler2.Invoke(new Women());
}
}