1. ホーム
  2. c#

C#の多次元配列はなぜIEnumerable<T>を実装しないのか?

2023-12-13 21:41:51

質問

C#の多次元配列には IEnumerable<T> を実装しているのに対し IEnumerable . 一次元配列の場合,両方とも IEnumerable<T>IEnumerable が実装されています。

なぜこのような違いがあるのでしょうか。もし多次元配列が IEnumerable であれば、きっと汎用版も実装されているはずですよね?私がこのことに気づいたのは、多次元配列の拡張メソッドを使おうとしたとき、それが Cast<T> などを使わないと失敗します。ですから、多次元配列に IEnumerable<T> .

私の質問をコードで明確にするために、私は次のコードが印刷されることを期待します。 true を4回表示すると思うのですが、実際には true , false , true , true :

int[] singleDimensionArray = new int[10];
int[,] multiDimensional = new int[10, 10];

Debug.WriteLine(singleDimensionArray is IEnumerable<int>);
Debug.WriteLine(multiDimensional is IEnumerable<int>);
Debug.WriteLine(singleDimensionArray is IEnumerable);
Debug.WriteLine(multiDimensional is IEnumerable);

どのように解決するのですか?

CLRには2種類の配列があります。 ベクトル と、0 ではない境界と 0 以外のランクを持つことができる、より一般的な配列です。

CLI仕様のセクション8.9.1より。

さらに、作成されたベクターで 要素タイプTを持つ インタフェース System.Collections.Generic.IList<U> (§8.7) を実装しており、U := T となります。

私にはかなり奇妙に見えると言わざるを得ません。すでに実装されていることを考えると IEnumerable を実装していることを考えると、なぜそれが IEnumerable<T> . を実装するのはあまり意味がないでしょう。 IList<T> を実装するのはあまり意味がありませんが、シンプルな汎用インターフェイスなら問題ないでしょう。

これを望むのであれば、どちらかというと Cast<T> (を呼び出すか(.NET 3.5を使用している場合)、配列内を反復する独自のメソッドを記述します。キャスティングを回避するには、各次元の下限/上限を見つける独自のメソッドを記述し、その方法で物を取得する必要があります。非常に快適ではありません。