C#2.0における汎用Array比較関数

public static bool Compare(Array ary1, Array ary2)
{
    if ((ary1 == null) || (ary2 == null))
        return ary1 == ary2;
    int j = ary1.Length;
    if (j != ary2.Length)
        return false;
    for (int i = 0; i < j; i++)
        if (!ary1.GetValue(i).Equals(ary2.GetValue(i)))
            return false;
    return true;
}

作ってみたが。他の手もあるのかな。
キャスト発生しまくりなのが気にいらないが汎用関数である時点で仕方ないか。
変数jはプロパティコール連発を避けるための処置。


ちなみにEqualsと==演算子のどっちを使用するかでEquals使用を推奨している輩がなぜか多いが、タイプセーフじゃない上暗黙または明示的なキャストが頻発するからやめた方がいい。
null対処も面倒くさいのに、なんでこんな推奨が根付いたのやら。