List <t>的扩展方法不接受List <int> </int> </t>

时间:2011-11-14 22:34:56

标签: c# generics extension-methods

我目前正在尝试扩展方法。我的目标是List的扩展方法,它在指定的索引之后找到适合集合中给定元素的第一个元素。

public static class Extensions
    {
        public static T FindFirstAfterIndex<T>(this List<T> list, int index, T item) where T : class                                                                                    where T : struct
        {
            return list.Skip<T>(index).Where<T>(result => result == item).First<T>();
        }
    }

所以这适用于T类对象。

我也尝试过:

public static T FindFirstAfterIndex<T>(this List<T> list, int index, T item) where T : class          
                                                                             where T : struct
{
    return list.Skip<T>(index).Where<T>(result => result == item).First<T>();
}

我对通用的东西很新,所以如何定义我的where子句以接受List<int>

问马克

4 个答案:

答案 0 :(得分:9)

根据约束条件,您的扩展方法无效:

   public static T FindFirstAfterIndex<T>(this List<T> list, int index, T item) 
       where T : class  where T : struct

where T : struct约束会一直滚动到您问题的右侧。)

您不能为此类型参数指定两个约束子句。您可以指定具有多个约束的一个约束子句(例如where T : class, IDisposable),但它不能同时包含classstruct约束。

如果您的扩展方法确实只有一个约束且该约束为where T : class,那么这就解释了为什么它对List<int>无效 - 因为int没有不满足引用类型约束。

坦率地说,你的方法会更好地写成:

public static T FindFirstAfterIndex<T>(this IEnumerable<T> list,
                                       int index, T item)
{
    return FindFirstAfterIndex(list, index, item, EqualityComparer<T>.Default);
}

public static T FindFirstAfterIndex<T>(this IEnumerable<T> list,
                                       int index, T item,
                                       IEqualityComparer<T> comparer)
{
    return list.Skip(index)
               .Where(result => comparer.Equals(result, item))
               .First();
}

现在它适用于任何列表,并将使用T的默认等式语义(例如,这将使List<string>更常规地工作)并且允许您在需要时提供自定义相等比较器。

答案 1 :(得分:6)

int不是一个类。 int将被装入一个struct(Int32)。

您必须删除该条款:

where T : class

或者改为使用Int32?

<强>更新

Int32?很可能不起作用,因为从技术上讲它仍然是一个结构:

public struct Nullable<T> where T : struct

如果你想在这里使用结构,你最好的办法是删除类约束。

答案 2 :(得分:6)

只需删除class约束:

public static T FindFirstAfterIndex<T>(this List<T> list, int index, T item) 
{

}

答案 3 :(得分:0)

public static class Extensions
{
    public static T FindFirstAfterIndex<T>(this List<T> list, int index, T item)
        where T :IComparable
    {
        return list.Skip<T>(index).Where<T>(result => result.CompareTo(item)==0).First<T>();
    }
}