我目前正在尝试扩展方法。我的目标是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>
?
问马克
答案 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
),但它不能同时包含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>
更常规地工作)并且允许您在需要时提供自定义相等比较器。
答案 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>();
}
}