2014-10-03 96 views
1

我有以下代码:需要添加C#genericclass 2号

public T[] Plus<T>(T[] a, T[] b, int size) 
{ 
    T[] sum = new T[size]; 
    for (int i = 0; i < size; i++) 
    { 
     sum[i] = a[i] + b[i]; 
    } 
    return sum; 
} 

,但它不工作。我如何计算“a”和“b”数组?

P.S. T可能只有sbyteintuintlongulong 对不起,我的英文不好。

+1

泛型不支持'+'等运算符。有办法做到这一点,但... – 2014-10-03 10:13:26

+0

这可能是帮助http://stackoverflow.com/questions/9338398/how-to-sum-generic-numbers-in-c – apomene 2014-10-03 10:15:43

+0

这可能有帮助http: //www.codeproject.com/Articles/8531/Using-generics-for-calculations – Christos 2014-10-03 10:16:21

回答

3

这是一个可怕的方式做到这一点,但它至少工作:

for (int i = 0; i < size; i++) 
    { 
     sum[i] = (dynamic)a[i] + (dynamic)b[i]; 
    } 

它,然而,做了很多的装箱和拆箱的。如果你想有一个更好的版本,你可能具有过载,而不是做的更好:

public static int[] Plus(int[] a, int[] b, int size) 
{ 
    int[] sum = new int[size]; 
    for (int i = 0; i < size; i++) 
    { 
     sum[i] = a[i] + b[i]; 
    } 
    return sum; 
} 
public static long[] Plus(long[] a, long[] b, int size) 
{ 
    long[] sum = new long[size]; 
    for (int i = 0; i < size; i++) 
    { 
     sum[i] = a[i] + b[i]; 
    } 
    return sum; 
} 

你也仍然可以破解一个通用版本:

public static T[] Plus<T>(T[] a, T[] b, int size) 
{ 
    switch(Type.GetTypeCode(typeof(T))) 
    { 
     case TypeCode.Int32: 
      return (T[])(object)Plus((int[])(object)a, (int[])(object)b, size); 
     case TypeCode.Int64: 
      return (T[])(object)Plus((long[])(object)a, (long[])(object)b, size); 
     // ...etc 
     default: 
      throw new NotSupportedException(); 
    } 
} 
+0

感谢您的详细解答。 – KAMAEL 2014-10-03 10:35:48

0

它需要A和B两个数组必须是相同的类型。

+0

在这个例子中,'a'和'b' **是**相同的类型;他们都是'T []' – 2014-10-03 10:21:07