vs2010——泛型委托的协变、逆变
2010-06-22 00:49
591 查看
在编程语言中,“协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。“逆变”则是指能够使用派生程度更小的类型。
在 .NET Framework 4 和 Visual Studio 2010 中,C# 和 Visual Basic 都支持在泛型接口和委托中使用协变和逆变,并允许隐式转换泛型类型参数。
如果泛型接口或委托的泛型参数声明为协变或逆变,则将该泛型接口或委托称为“变体”。C# 和 Visual Basic 都允许您创建自己的变体接口和委托。
在匹配方法签名和委托类型方面,非泛型委托也支持协变和逆变。这样,您不仅可以为委托指派具有匹配签名的方法,而且可以指派这样的方法:它们返回与委托类型指定的派生类型相比,派生程度更大的类型(协变),或者接受相比之下,派生程度更小的类型的参数(逆变)。
实例首先定义一个接口IColor及两个派生类
public interface IColor { } public class Red : IColor { } public class Blue : IColor { }
定义ColorDemo类用来写展示协变与逆变的逻辑
public class ColorDemo{}
编写具体实现
public class ColorDemo { //协变委托 private delegate T CovarianceDelegate<out T>(); //逆变委托 private delegate void ContravarianceDelegate<in T>(T color); private static string colorInfo; public void CoreMethod() { //协变 CovarianceDelegate<IColor> a1 = ColorMethod; a1.Invoke(); CovarianceDelegate<Red> a2 = RedMethod; a2.Invoke(); a1 = a2; a1.Invoke(); //逆变 ContravarianceDelegate<Blue> b1 = BlueMethod; b1.Invoke(new Blue()); ContravarianceDelegate<IColor> b2 = ColorMethod; b2.Invoke(new Red()); b1 = b2; b1.Invoke(new Blue()); } private IColor ColorMethod() { colorInfo = "无色"; Console.WriteLine(colorInfo); return null; } private void ColorMethod(IColor color) { colorInfo = "无色"; Console.WriteLine(colorInfo); } private Red RedMethod() { colorInfo = "红色"; Console.WriteLine(colorInfo); return new Red(); } private void BlueMethod(Blue blue) { colorInfo = "蓝色"; Console.WriteLine(colorInfo); } }
运行结果
static void Main(string[] args) { ColorDemo colorDemo =new ColorDemo(); colorDemo.CoreMethod(); Console.ReadLine(); }
相关文章推荐
- 第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- c#4.0泛型接口和泛型委托的协变和逆变
- 泛型委托的逆变和协变
- [译]委托和接口泛型参数类型的协变和逆变
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- c#4.0——泛型委托的协变、逆变
- .NET 4.0中的泛型的协变和逆变
- 泛型--协变与逆变(转)
- .Net 2.0 新功能:委托中的协变与逆变(Covariance and Contravariance in Delegates)
- ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
- C# 泛型的协变和逆变
- 泛型接口的协变和逆变
- 泛型类型的协变(covariant)和逆变
- 泛型中的协变Covariance和逆变Contravariance
- 警惕泛型是不能协变和逆变的
- Covariance and Contravariance in Generics(泛型中的协变和逆变)
- c#中泛型的协变与逆变:<in T>详解