2010-09-22 149 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以上的计数的特定属性以及我可以订阅并使用自定义代码处理的特定事件的穿着者所穿的,那么我认为这会让编程更有趣活泼。