歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C#中的泛型(類型參數的約束)

C#中的泛型(類型參數的約束)

日期:2017/3/1 9:46:09   编辑:Linux編程

首先,來看一個程序,對泛型有一個初步的認識。

namespace ConsoleApplication
{
class GenericDemo
{
public static void Test()
{
double[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
PrintArrayInfo(numbers);
numbers = RemoveElement(numbers, 1);
PrintArrayInfo(numbers);
}

private static void PrintArrayInfo(double[] numbers)
{
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i]);
Console.Write(" ");
}
Console.WriteLine();
}

public static T[] RemoveElement<T>(T[] array, int position) where T : struct
{
for (int i = position; i < array.Length - 1; i++)
{
array[i] = array[i + 1];
}
array[array.Length - 1] = default(T);
return array;
}
}
}

RemoveElement方法用於刪除數組中指定位置的元素,PrintArrayInfo方法用於輸出數組。

因為我們的數組中存儲的元素類型是不確定的,所以這裡我們用到了泛型,其中where T : strut子句約束參數類型T必須為值類型。當然這個程序我們不使用泛型,直接定義Object類型的數組也可以。

下面重點說說C#中泛型類型參數的約束:

在定義泛型類時,可以對客戶端代碼能夠在實例化類時用於類型參數的類型種類施加限制。 如果客戶端代碼嘗試使用某個約束所不允許的類型來實例化類,則會產生編譯時錯誤。 這些限制稱為約束。 約束是使用 where 上下文關鍵字指定的。下面是摘自MSDN的表格:

約束

說明

T:strut

類型參數必須是值類型。 可以指定除 Nullable 以外的任何值類型。 有關更多信息,請參見使用可以為 null 的類型(C# 編程指南)。

T:class

類型參數必須是引用類型;這一點也適用於任何類、接口、委托或數組類型。

T:new()

類型參數必須具有無參數的公共構造函數。 當與其他約束一起使用時,new() 約束必須最後指定。

T:<基類名>

類型參數必須是指定的基類或派生自指定的基類。

T:<接口名稱>

類型參數必須是指定的接口或實現指定的接口。 可以指定多個接口約束。 約束接口也可以是泛型的。

T:U

為 T 提供的類型參數必須是為 U 提供的參數或派生自為 U 提供的參數。

於是,我想能不能寫一個簡單的泛型類,其中裡面實現對數值類型的加減乘除四則運算,遇到的問題是 :where子句後面的約束怎麼寫,我查看的數值型的類Int32等等,它們的基類是Object,如果直接定義一個泛型參數T,進行加減乘除運算是不被允許的。最後,在MSDN上找了找資料,發現C#中時沒辦法實現的。

���果有朋友,發現了解決問題的方法,請分享下!願共同學習!

Copyright © Linux教程網 All Rights Reserved