泛型类型的继承

时间:2010-09-22 03:50:00

标签: c# generics inheritance generic-programming

任何人都可以帮我使用Where for generic类型吗? 我试图创建一个函数,它使用多个类型double或int来执行ST,所以我说它应该是泛型函数。但是当我尝试为该泛型类型的变量赋值时,我不能,因为它不是数字类型。另外,我不能使用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;

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

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

不确定您所指的“Where”是什么,但您可以将通用函数声明为

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

我相信intdouble都会实施IComparable<T>

答案 1 :(得分: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库只是为这类事情单独实现,而不是试图使用泛型。

答案 2 :(得分:1)

泛型中的约束系统仍然非常粗糙。它仍然是一个生硬的工具,可供选择的选项相对较少。用于表达类型参数约束的更丰富的特征集将允许将各种复杂的算法设计为基于模式的编程等。

如果你只是告诉我T是我正在看的衬衫类型......我可以用它做很多事情。但是,如果T不仅仅是一件衬衫,而且实际上是由一个带有一些int []属性的警报器穿着,其中有30个以上的计数以及我可以订阅并使用自定义代码处理的某些事件,那么我认为它会让编程变得更有趣活泼。

答案 3 :(得分:0)

您可以将通用类型参数约束为 struct 。 Struct表示类型为int或double的值。以下是MSDN article:

的示例
public class MyClass<T> where T : struct 

{...}