Ваш метод расширения недействителен с точки зрения его ограничений:
public static T FindFirstAfterIndex<T>(this List<T> list, int index, T item)
where T : class where T : struct
(Ограничение where T : struct
прокручивается полностью вправо по вашему вопросу.)
Вы не можете указать два предложения ограничения для одного и того же параметра типа, как это. Вы можете указать one условие ограничения с несколькими ограничениями (например, 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>
), а также позволит вам указать Пользовательский равенство равенства, когда вы хотите.