C# 入门(13) 泛型(generic)、协变(convariance)、逆变(contravariance)
2017-05-04 10:48
435 查看
C#的泛型、协变、逆变
参考书籍: 《C#图解教程》泛型是个好东西。很多模版类都用到泛型。
约束(constrain)类型和次序
可以约束泛型,但有特定的顺序。在类后面加where 关键字越详细的约束应该放在越靠前的地方。
可以有任意多个接口约束。
如果有构造函数约束,放在最后。
如果泛型方法接受一个同类型参数,可以省略尖括号。
//类型参数 和 方法参数类型 相同。 public void MyMethod<T> (T value) {...} int myValue = 666; MyMethod<int>(myValue); MyMethod(myValue); //等价与上一句
泛型接口的实现必须唯一。在实现泛型接口时,要保证类型实参组合不会产生两个一样的接口。看如下代码:
interface IMyIfc<T> {} class MyClass<S> : IMyIfc<int> , IMyIfc<S> //错误!!因为S可能是int类型。 { }
协变
对于泛型来说,想要把子类分配给父类的变量,就要用到协变。看代码:class Animal { public int Legs = 4; } class Dog : Animal { } delegate T Factory<T>(); class Program2 { static Dog MakeDog() { return new Dog(); } static void Main(string[] args) { Factory<Dog> dogMaker = MakeDog; Factory<Animal> animalMaker = dogMaker; //报错,无法隐式转换 Console.WriteLine(animalMaker().Legs.ToString()); Console.ReadLine(); } }
尽管Dog是Animal的子类,但Factory< Dog >并不是Factory< Animal>的子类,所以无法进行转换。这时候用协变就好了(添加out 关键字)。
delegate T Factory<out T>(); //out指定了类型参数的协变。
逆变
和协变相似,逆变用 in 关键字指定类型参数。是从基类赋值给派生类。协变和逆变总结
显式变化使用in和out关键字只适用于委托和接口,不适用于类、结构和方法。
可以参考别人家的博客:对协变和逆变的简单理解
相关文章推荐
- C#基础笔记——协变(Covariance)和逆变(Contravariance)
- C# 协变逆变(泛型修饰符in和out)
- c#中泛型的协变与逆变:<in T>详解
- C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题
- C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型
- C# 泛型的协变和逆变 (转载)
- 理解 C# 泛型接口中的协变与逆变(抗变)
- C#中泛型的协变与逆变的理解【转】(比较容易理解)
- C# 泛型的协变和逆变
- C#中的协变(Covariance)和逆变(Contravariance)
- C# 泛型的协变和逆变
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- C#里泛型接口支持协变、逆变和不支持协变、逆变的对比?
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- C# 泛型的协变和逆变
- Covariance and Contravariance in Generics(泛型中的协变和逆变)
- 泛型中的协变Covariance和逆变Contravariance
- CLR VIA C# 泛型的协变和逆变
- C# 泛型的协变和逆变
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对