C#入门经典学习12-泛型2

来源:互联网 发布:邓肯数据不怎样 编辑:程序博客网 时间:2024/06/11 01:41

定义泛型
class MyClass<T1,T2,T3>
{
}
可以把它们用作字段的类型,属性的类型,方法的返回值以及参数类型。
不能假定他是什么类型而使用他,通常只能把他看作System.Object的类型。

可以进行null比较
(T1 op1,T2 op2)
if(op1 != null && op2 == null)
不能进行 op1 == op2

不能进行
T1 op1 = null
可以进行
T1 op1 = default(T1)

约束类型
多个约束用逗号隔开
可以有个where对任意或全部类型进行约束
约束必须出现在继承的后面
class MyClass<T1,T2,T3> :MyBaseClass,IMyInterface
where T1 : constraint1,constraint2 where T2 : constraint3
{
}

可用的约束
struct 值类型
class 引用类型
base-class 基类或继承自基类
interface 接口或实现了接口
new() 有一个公共的无参构造函数,必须是为类型指定的最后一个约束

泛型继承
类型约束至少与基类相同
泛型类可以从具体的、封闭式构造或开放式构造基类继承
class BaseNode { }
class BaseNodeGeneric<T> { }

// concrete type
class NodeConcrete<T> : BaseNode { }

//closed constructed type
class NodeClosed<T> : BaseNodeGeneric<int> { }

//open constructed type
class NodeOpen<T> : BaseNodeGeneric<T> { }

非泛型类可以从封闭式构造基类继承,但无法从开放式构造类或类型参数继承,因为在运行时客户端代码无法提供实例化基类所需的类型参数。
//No error
class Node1 : BaseNodeGeneric<int> { }

//Generates an error
//class Node2 : BaseNodeGeneric<T> {}

//Generates an error
//class Node3 : T {}

从开放式构造类型继承的泛型类必须为任何未被继承类共享的基类类型参数提供类型变量,如以下代码所示:
class BaseNodeMultiple<T, U> { }

//No error
class Node4<T> : BaseNodeMultiple<T, int> { }

//No error
class Node5<T, U> : BaseNodeMultiple<T, U> { }

//Generates an error
//class Node6<T> : BaseNodeMultiple<T, U> {}

从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束的超集或暗示基类型约束:
class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }

开放式构造类型和封闭式构造类型可以用作方法参数:
void Swap<T>(List<T> list1, List<T> list2)
{
    //code to swap items
}

void Swap(List<int> list1, List<int> list2)
{
    //code to swap items
}

泛型运算符
泛型结构
泛型接口
泛型方法
泛型类型参数会改变方法的签名
定义泛型委托 也可以使用约束
public delegate int MyDelegate<T1,T2>(T1 op1, T2 op2) where T1 :T2 ;

变体(variance)
协变(covariance)只能用作返回值
抗变(contravariance)
http://www.cnblogs.com/artech/archive/2011/01/13/1934914.html

原创粉丝点击