14

私は、いくつかの異なるタイプの配列を使用した小さなプロジェクトに取り組んでいます (例: 、double[]。検証/テスト/健全性の目的で、これらの配列のいくつかをコンソールに出力しています。したがって、複数の機能があります。以下のようになります (この例では単純化されています - 1 次元配列のみを扱っていると仮定します):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'

説明を探しました (類似または封印されたクラスですが、 msdnObjectに関する言及以外にあまり見つかりませんでした。なぜそうなのか説明してもらえますか?の型制約を指定できないのはなぜですか?System.Array

ps: これを入力しているときに、次のような単純な関数を使用して、当初望んでいたことをより簡単に達成できることに気付きました。

void Print(System.Array a)
{
    for (int i = 0; i < a.Length; i++)
    {
        Console.Write(a.GetValue(i));
    }
}

これが、コンパイラに配列に関する特別な規則がある理由ですか?

4

2 に答える 2

23

必要なことを行うための適切な構文は次のとおりです。

void Print<T>(T[] array)
{
    for (int i = 0; i < array.Length; i++)
    {
        Console.Write(array[i]);
    }
}
于 2013-02-10T05:31:33.770 に答える