c# - List<T> 的扩展方法不接受 List<int>

标签 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>();
}

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

问候马克

最佳答案

您的扩展方法在其约束方面无效:

   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>)并且还允许您在需要时提供自定义相等比较器。

关于c# - List<T> 的扩展方法不接受 List<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8129188/

相关文章:

c# - 停止访问的推荐方法是什么?

c# - 如何在长行返回关键字后阻止 Resharper 换行?

java - 具有泛型类型的方法调用链(好奇地重复泛型模式)

c# - 是否可以为控制台编写扩展方法?

c# - 对可能未初始化的字典元素执行加等于操作的简洁方法

vb.net 从 "GetFiles"中排除扩展名

javascript - 我无法运行 Javascript 代码

c# - Azure.Data.Tables.TableClient 是线程安全的吗?

c# - 泛型方法的可为空参数类型 <T>?

.net - 将反射 .GetValue() 对象强转换为通用 DbSet