C# 逆變和協(xié)變?cè)斀?/h3>
|
![]() |
admin
![]() 2024年12月2日 9:45 本文熱度 1183 |
C#中的逆變(Contravariance)和協(xié)變(Covariance)是泛型特性中的重要概念,它們?cè)试S在泛型委托、泛型接口以及數(shù)組中進(jìn)行更靈活的類型轉(zhuǎn)換。以下是對(duì)C#中逆變和協(xié)變的詳細(xì)解釋:
一、協(xié)變(Covariance)
1.定義:協(xié)變是指在泛型類型的使用中,允許將某個(gè)類型參數(shù)替換為該參數(shù)的派生類(即更具體的類型)。換句話說(shuō),協(xié)變?cè)试S在泛型委托或接口中使用更具體的類型作為返回類型。
2.使用場(chǎng)景:
3.示例:
// 基類
public class Animal
{
public virtual void Speak()
{
Console.WriteLine("Animal speaks");
}
}
// 派生類
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Dog barks");
}
}
// 定義一個(gè)協(xié)變的委托
public delegate T AnimalDelegate<out T>();
class Program
{
static void Main()
{
// 將返回Dog類型的委托賦值給返回Animal類型的委托
AnimalDelegate<Animal> animalDelegate = GetDog;
Animal animal = animalDelegate();
animal.Speak(); // 輸出: Dog barks
}
static Dog GetDog()
{
return new Dog();
}
}
二、逆變(Contravariance)
1.定義:逆變是指在泛型類型的使用中,允許將某個(gè)類型參數(shù)替換為該參數(shù)的基類(即更不具體的類型)。這種特性通常在需要處理不同類型的對(duì)象時(shí)非常有用,特別是在方法參數(shù)時(shí)。
2.使用場(chǎng)景:
3.示例:
// 基類
public class Animal
{
public string Name { get; set; }
}
// 派生類
public class Dog : Animal {}
// 定義一個(gè)逆變的委托
public delegate void AnimalAction<in T>(T animal);
class Program
{
static void Main()
{
// 將接受Animal類型的委托賦值給接受Dog類型的委托
AnimalAction<Animal> animalAction = MakeSound;
Dog dog = new Dog { Name = "Buddy" };
animalAction(dog); // 輸出: Buddy makes a sound
}
static void MakeSound(Animal animal)
{
Console.WriteLine($"{animal.Name} makes a sound");
}
}
三、注意事項(xiàng)