我正在开发一个带有几种不同类型数组的小项目(例如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));
}
}
Intellisense 没有抱怨,但编译器失败并出现一个非常有趣的错误:
Constraint cannot be special class 'System.Array'
我一直在寻找解释(类似于或密封类,但除了在 msdn 上Object
提及之外,还没有找到太多。谁能向我解释为什么会这样?为什么我不能指定类型约束?System.Array
ps:在打字的时候,我意识到我可以更容易地完成我最初想要的事情,用一个简单的函数如下:
void Print(System.Array a)
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a.GetValue(i));
}
}
这就是为什么编译器中有一个特殊的数组规则吗?