扩展方法.类型或命名空间名称';T';找不到

本文关键字:找不到 方法 类型 命名空间 扩展 | 更新日期: 2023-09-27 18:25:03

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

扩展方法.类型或命名空间名称';T';找不到

尝试:

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都是从中推断出来的)。

您错过了通用方法定义:

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>