1

我有一个通用方法,它采用 T 类型的 Enumerables。如果 T 也是 Enumerable,我需要将它传递给另一个函数。但是,由于该函数只接受 Enumerables,并且 T 是通用的,因此它不会编译。我在通过之前检查 T 是否可枚举 - 但显然不是以解决这个问题的方式。

我怎样才能做到这一点?

(显然我可以编写另一种只采用 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 回答