我工作的一个小项目有一些不同类型的数组(如double[]
float[]
int[]
为了验证/测试/神智的目的,我打印出一些阵列控制台为我走所以我有一个看起来像下面的这些多种功能(简化这个例子 - 假设我只处理一维数组):
void Print(float[] a) // prints an array of floats
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
void Print(double[] a) // prints an array of doubles
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
我,在我无穷的智慧,以为可以通过简单地创建这些功能的通用版本,减少一些重复的代码。 所以我尝试这样做:
void Print<T>(T t) where T : Array
{
for (int i = 0; i < t.Length; i++)
{
Console.Write(t.GetValue(i));
}
}
智能感知不抱怨,但是编译器失败,一个很有趣的错误:
Constraint cannot be special class 'System.Array'
我看过一个解释(类似于Object
或密封类,但都没有找到多少,除了一提的MSDN上 。任何人都可以向我解释为什么是这样的情况?为什么我不能指定类型约束System.Array
?
PS:虽然打字了这一点,我意识到,我可以完成我本来想更容易,像这样一个简单的函数:
void Print(System.Array a)
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a.GetValue(i));
}
}
这是为什么有在编译器阵列中一个特殊的规则?