我目前正在试验扩展方法。我的目标是 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
),但不能同时包含 class
和 struct
约束条件。
如果您的扩展方法真的只有一个约束并且该约束是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/