为什么System.Array不能成为类型约束?

vla*_*lad 8 .net c# arrays compiler-errors generic-constraints

我工作的一个小项目有一些不同类型的数组(例如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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我以无限的智慧认为,通过简单地创建这些函数的通用版本,我可以减少一些代码重复.所以我尝试了这个:

void Print<T>(T t) where T : Array
{
    for (int i = 0; i < t.Length; i++)
    {
        Console.Write(t.GetValue(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

Intellisense没有抱怨,但编译器失败并出现一个非常有趣的错误:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是编译器中数组有特殊规则的原因吗?

Ser*_*rvy 17

执行所需操作的相应语法是:

void Print<T>(T[] array)
{
    for (int i = 0; i < array.Length; i++)
    {
        Console.Write(array[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 有道理,但我仍然好奇_why_我不能有'Array`的基类类型约束... (2认同)