2010-09-22 260 views
0

任何人都可以幫助我使用凡泛型類型? 我試圖創建一個函數,它使用double或int類型的數字,所以我說它應該是泛型函數。但是,當我嘗試爲該泛型類型的變量賦值時,我不能,因爲它不是數值類型。另外,我不能使用Where從int或double數據類型繼承泛型類型。泛型類型的繼承

下面是代碼:
public static T[,] Unit(int n) where T : PROBLEM
{

T[,] mat = new T[n, n]; 

    for (int i = 0; i < n; i++) 
     mat[i, i] = (T)1;  

    return mat; 

}

誰能幫助?

+1

你可以發表一個例子嗎? – asawyer 2010-09-22 03:51:25

+0

謝謝邁克爾糾正我。 :) – 2010-09-22 03:57:15

+0

什麼是'ST',並用數字做一個? – Gabe 2010-09-22 04:08:59

回答

1

不幸的是C#的缺點之一是你不能輕易地製作通用數值算法。你可以種破解它周圍,就像使用從MSDN這個例子:

public abstract class BaseCalculator<T> 
{ 
    public abstract T Add(T arg1,T arg2); 
    public abstract T Subtract(T arg1,T arg2); 
    public abstract T Divide(T arg1,T arg2); 
    public abstract T Multiply(T arg1,T arg2); 
} 
public class IntCalculator : BaseCalculator<int> 
{ 
    public override int Add(int arg1, int arg2) 
    { 
     return arg1 + arg2; 
    } 
    //Rest of the methods 
} 

但一般來說,.NET庫只是有這樣的事情一個獨立的實現,而不是試圖使用泛型。

0

您可以將您的泛型類型參數限制爲struct。 Struct表示像int或double這樣的值類型。下面是來自MSDN article:

public class MyClass<T> where T : struct 

{...} 
1

不知道這是什麼「去哪兒」是你所指的例子,但是你可以宣佈你的通用功能

public T Calculate<T>(T x, T y) where T : IComparable<T> 
{ 
    // do calculations 
} 

我相信intdouble都實現IComparable<T>

+0

它不工作...因爲我試圖分配值並執行ST,但錯誤消息說我無法將int轉換爲T ... – 2010-09-22 04:16:53

1

泛型中的約束系統仍然非常粗糙。它仍然是一個鈍器,可供選擇的選項相對較少。用於表達對類型參數約束的更豐富的功能將允許各種複雜的算法設計爲基於模式的編程等。

如果您只告訴我T是我正在查看的襯衫類型...我可以用它做很多事情。但是,如果T不僅僅是一件襯衫,而且實際上是由一個擁有一些int []特性並且具有30以上的計數的特定屬性以及我可以訂閱並使用自定義代碼處理的特定事件的穿着者所穿的,那麼我認爲這會讓編程更有趣活潑。