0

谁能帮助我将 Where 用于泛型类型?我试图创建一个函数,它使用一些 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;

}

任何人都可以帮忙吗?

4

4 回答 4

1

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

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

我相信int并且double两者都实施IComparable<T>

于 2010-09-22T03:55:18.083 回答
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 库对于这类事情只有一个单独的实现,而不是尝试使用泛型。

于 2010-09-22T04:16:45.917 回答
1

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

如果你只告诉我 T 是我正在寻找的衬衫类型......我无能为力。但是,如果 T 不仅是一件衬衫,而且实际上是由一个带有一些 int[] 属性的 hooter 穿着的,这些属性的计数在 30 位以上,并且我可以订阅并使用自定义代码处理某些事件,那么我认为它会让编程变得更有趣和活泼。

于 2010-09-22T06:37:02.133 回答
0

您可以将泛型类型参数限制为struct。Struct 表示像 int 或 double 这样的值类型。这是MSDN 文章中的一个示例:

public class MyClass<T> where T : struct 

{...}
于 2010-09-22T03:54:30.070 回答