問題來源:在c#編程中,經常會對一些數字型基元類型如Int16,Int32,Int64,Decimal等,做一些加減乘除等等運算的事情。比如我們經常寫出下面的方法,用來計算從0開始到輸入的32位整數之間數字的總和(沒有考慮溢出等特殊情況):
1
internal
static
Int32 Sum(
int
num)
2
{
3
Int32 sum = 0;
4
for
(Int32 i = 0; i < num; i++)
5
{
6
sum += i;
7
}
8
return
sum;
9
}
同理,如果我們需要返回類型和輸入類型為其他基元類型,如Decimal,Int64等等,正常情況下我們都會修改上述代碼中返回和輸入參數類型,比如可以這樣對Int64進行求和:
1
internal
static
Int64 Sum(Int64 num)
2
{
3
Int64 sum = 0;
4
for
(Int64 i = 0; i < num; i++)
5
{
6
sum += i;
7
}
8
return
sum;
9
}
但是這樣有多少種不同的基元數字類型是不是就要寫多少個這樣的方法(這裡不考慮某些數字型基元類型之間的相互轉換),造成方法膨脹,代碼臃腫?大家分析上面的代碼,發現參數個數,運算格式非常類似,毫無疑問會想到抽象出一個公共的泛型方法來解決數字型基元類型的運算問題。
在<<CLR Via C#>>一書中,Jeffrey Richter就舉例並“千方百計”的想實現下面的泛型方法來實現泛型類型變量作為操作數的通用解決方案:
01
internal
static
class
UsingGenericTypeVariablesAsOperands
02
{
03
private
static
T Sum<T>(T num) where T :
struct
04
{
05
T sum =
default
(T);
06
for
(T n =
default
(T); n < num; n++)
07
sum += n;
08