扩展方法。找不到类型或命名空间名称“T”

时间:2013-07-25 09:00:47

标签: c# .net

我有以下代码,我在.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?) 

2 个答案:

答案 0 :(得分: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都是从中推断出来的)。

答案 1 :(得分: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>