9

我有以下在 .NET 4.0 项目中编译的代码

public static class Ext 
{
    public static IEnumerable<T> Where(this IEnumerable<T> source, Func<T, bool> predicate)
    {
        if (source == null)
        {
            throw new ArgumentNullException("source");
        }
        if (predicate == null)
        {
            throw new ArgumentNullException("predicate");
        }
        return WhereIterator(source, predicate);
    }

    private static IEnumerable<T> WhereIterator(IEnumerable<T> source, Func<T, bool> predicate)
    {
        foreach (T current in source)
        {
            if (predicate(current))
            {
                yield return current;
            }
        }
    }
}

但出现以下错误。我已经将 System.dll 作为默认值包含在引用中。我可能做错了什么?

Error   1   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

Error   2   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

Error   3   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 
4

2 回答 2

23

尝试:

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)

private static IEnumerable<T> WhereIterator<T>(IEnumerable<T> source, Func<T, bool> predicate)

简而言之,您在方法签名中缺少通用 T 声明(所有其他 T 都是从中推断出来的)。

于 2013-07-25T09:02:38.413 回答
5

您错过了通用方法定义:

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    if (predicate == null)
    {
        throw new ArgumentNullException("predicate");
    }
    return WhereIterator(source, predicate);
}

private static IEnumerable<T> WhereIterator<T>(IEnumerable<T> source, Func<T, bool> predicate)
{
    foreach (T current in source)
    {
        if (predicate(current))
        {
            yield return current;
        }
    }
}

注意<T>方法名称后面的。

于 2013-07-25T09:04:22.337 回答