1

T 型の Enumerable を受け取るジェネリック メソッドがあります。T も Enumerable である場合は、それを別の関数に渡す必要があります。ただし、その関数は Enumerables のみを受け取り、T はジェネリックであるため、コンパイルされません。T を渡す前に Enumerable であることを確認していますが、明らかにこの問題を解決する方法ではありません。

これどうやってするの?

(明らかに、IEnumerable< IEnumerable< T>> のみを受け取る別のメソッドを作成し、関連する場所でそれを使用することもできますが、それは洗練されていないようです。)

例:

public static bool EnumerablesAreEqual<T>(IEnumerable<T> a, IEnumerable<T> b)
{
    foreach (T x in a)
    {
        if (x is Enumerable && !EnumerableContainsEnumerable(x, b))
            return false;
        if (!b.Contains(x))
            return false;
    }
    ...
}

この投稿を見ましたが、まったく同じ問題ではないと思います。

4

1 に答える 1

5

変数の動的型をチェックしても、その静的型は変更されず、呼び出しのチェックに使用されるものは変更されません。

あなたがそれをしたいなら、キャストが必要です。チェックされたキャストを使用して、一度に実行できます。

Enumerable ex = x as Enumerable;
if (ex != null && !EnumerableContainsEnumerable(ex, b))
    return false;

asオペレーターは、キャストが可能かどうかをチェックします。可能な場合は、キャストされたオブジェクトを返します。そうでない場合は、 を返しnullます。

于 2013-07-14T07:34:58.260 に答える