在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T: 
T 是引用类型还是值类型。
如果 T 为值类型,则它是数值还是结构。
给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自 GenericList<T> 类的示例显示了如何使用 default 关键字。
Demo:
Class class = new Class();
public void get<T>(T class)
{
class = default(T);
}
result: class =null;1.泛型和泛型强制转换
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace VS2005Demo2
6
{
7
8
C# 编译器只允许将泛型参数隐式强制转换到 Object 或约束指定的类型
23
24
编译器允许您将泛型参数显式强制转换到其他任何接口,但不能将其转换到类
36
37
38
使用临时的 Object 变量,将泛型参数强制转换到其他任何类型
48
49
使用is和as运算符
63
64
}
65
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace VS2005Demo26
{7

8
C# 编译器只允许将泛型参数隐式强制转换到 Object 或约束指定的类型23

24
编译器允许您将泛型参数显式强制转换到其他任何接口,但不能将其转换到类36

37

38
使用临时的 Object 变量,将泛型参数强制转换到其他任何类型48

49
使用is和as运算符63

64
}65

2.继承和泛型
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace VS2005Demo2
6
{
7
继承和泛型
17
18
继承约束
36
37
虚拟方法
62
63
接口、抽象类继承
78
79
泛型抽象方法和泛型接口
119
120
}
121
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace VS2005Demo26
{7
继承和泛型17

18
继承约束36

37
虚拟方法62

63
接口、抽象类继承78

79
泛型抽象方法和泛型接口119

120
}121

3.泛型方法
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace VS2005Demo2
6
{
7
8
泛型方法
26
27
编译器无法只根据返回值的类型推断出类型
44
45
泛型方法约束
52
53
泛型虚拟方法
92
93
泛型静态方法
129
}
130
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace VS2005Demo26
{7

8
泛型方法26

27
编译器无法只根据返回值的类型推断出类型44

45
泛型方法约束52

53
泛型虚拟方法92

93
泛型静态方法129
}130

4.泛型委托
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace VS2005Demo2
6
{
7
泛型委托
31
32
委托泛型参数
62
63
委托泛型参数
66
67
事件
95
}
96
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace VS2005Demo26
{7
泛型委托31

32
委托泛型参数62

63
委托泛型参数66

67
事件95
}96

public class Customer
{
private int _seqnum;
public int SequenceNumber {
get { return _seqnum; }
set { _seqnum = value; }
}
private string _name;
public string Name {
get { return _name; }
set { _name = value; }
}
private DateTime _lastPurchaseDate;
public DateTime LastPurchaseDate {
get { return _lastPurchaseDate; }
set { _lastPurchaseDate = value; }
}
public Customer(int seqnum, string name,
DateTime lastPurchaseDate) {
SequenceNumber = seqnum;
Name = name;
LastPurchaseDate =lastPurchaseDate;
}
}
protected void Page_Load(object sender, EventArgs e)
{
List<Customer> items = new List<Customer>();
items.Add(new Customer(1, "howard", new DateTime(2006, 1, 1)));
items.Add(new Customer(2, "lee", new DateTime(2006, 2, 1)));
items.Add(new Customer(3, "dierking", new DateTime(2006, 3, 1)));
items.Add(new Customer(4, "jennifer", new DateTime(2006, 4, 1)));
items.Add(new Customer(5, "christine", new DateTime(2006, 5, 1)));
items.Add(new Customer(6, "hannah", new DateTime(2006, 6, 1)));
items.Add(new Customer(7, "leah", new DateTime(2006, 7, 1)));
items.Add(new Customer(8, "anne", new DateTime(2006, 8, 1)));
items.Add(new Customer(9, "dan", new DateTime(2006, 9, 1)));
items.Add(new Customer(10, "mary", new DateTime(2006, 10, 1)));
Customer ret;
//find customer by a specified name
string searchName = "howard";
ret = items.Find(delegate(Customer cust) { return cust.Name == searchName; });
//find customer by an id
int searchID = 4;
ret = items.Find(delegate(Customer cust) { return cust.SequenceNumber == searchID; });
}
public Customer FindCustomerByName(IEnumerable cutsomers, string name)
{
foreach (Customer customer in cutsomers)
{
if (customer.Name == name)
{
return customer;
}
}
return null;
}
此方法段本人只是实践一下泛型+委托。<看不懂要反馈>
delegate L GetDefaultDomain<L>(string domainName);
SearchDomain

}