2012-12-24 40 views
11

可能重複:
Arithmetic operator overloading for a generic class in C#操作泛型重載

這裏是我創建加複數重載運算符泛型類的代碼。

public class Complex<T> 
{ 
    public T _a, _b; 
    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 
    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     return new Complex<T>(i._a + j._a, i._b + j._b); 
    } 
} 

有了這個,我已經得到的錯誤工作時,

Error: Operator '+' cannot be applied to operands of type 'T' and 'T' 

任何一個可以建議我的方式,我可以使用運算符重載泛型?

+1

http://stackoverflow.com/questions/756954/arithmetic-operator-overloading-for-a-generic-class-in- C-尖銳 – Habib

+0

和也:http://stackoverflow.com/questions/147646/solution-for-overloaded-operator-constraint-in-net-generics不能夠限定值類型與操作符重載是C#的一個嚴重的限制。根本沒有可用的滿意工作。 – citykid

+0

這不應該是通用的。只有在有**的任何**類型時纔有意義;這就是爲什麼他們被稱爲*泛型*。 –

回答

22

問題是編譯器無法知道是否+符可以應用到T。不幸的是,沒有辦法將T限制爲C#中的數字類型。

但是,你也許可以這樣使用動態運行時解決方法:

public class Complex<T> where T : struct 
{ 
    public T _a, _b; 
    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 
    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     return new Complex<T>(Sum(i._a, j._a), Sum(i._b, j._b)); 
    } 

    private static T Sum(T a, T b) 
    { 
     return (dynamic)a + (dynamic)b; 
    } 
} 
+0

哇。我多次看過這個問題,但我從未見過這個答案。我回到過去發佈操作代碼來完成'(動態)'演員似乎要做的事情。有趣。 – ja72

0

不能總結兩個通用的對象類型;在靜態函數你想添加T型i._a和j._a。的兩個元素,但是T可以是任何類型的

你試圖做什麼的?

2

如果你要作弊,可以暫時將其標記爲dynamic類型,並允許運行,以確定如何做到這一點。只要您使用類型T定義+運營商,它會工作。這意味着它將適用於數字和字符串,或任何類型(自定義或其他);不知道這是否是您的意圖Complex或不。另外,如果沒有+運算符可以利用,則會在運行時拋出異常;有沒有辦法(我知道)做編譯時檢查這一點。

public class Complex<T> 
{ 
    public T _a, _b; 
    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 
    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     dynamic d_i = i; 
     dynamic d_j = j; 
     return new Complex<T>(d_i._a + d_j._a, d_i._b + d_j._b); 
    } 
} 

示例用法與字符串:

Complex<string> i = new Complex<string>("Hel", "Wor"); 
Complex<string> j = new Complex<string>("lo ", "ld!"); 

Complex<string> ij = i + j; 

Console.WriteLine(ij._a + ij._b); //Hello World! 
0

如上所述,可以限制TIConvertible,然後使用decimal類型以執行期望的數學函數如下:

public class Complex<T> where T : struct, IConvertible 
{ 
    public T _a, _b; 

    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 

    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     return new Complex<T>(Sum(i._a, j._a), Sum(i._b, j._b)); 
    } 

    private static T Sum(T a, T b) 
    { 
     return (T)Convert.ChangeType(a.ToDecimal(CultureInfo.CurrentCulture) + b.ToDecimal(CultureInfo.CurrentCulture), typeof(T)); 
    } 
}