Вы ищете универсальные ограничения , но вы не можете ограничить параметр типа, чтобы он действовал только для определенного набора типов. Самое близкое, что вы могли бы прийти, было бы что-то вроде:
public static decimal FindBestSubsequence<T>
(this IEnumerable<T> source, out int startIndex, out int endIndex)
where T : struct, IConvertible, IFormattable, IComparable<T>, IEquatable<T>,
IComparable
... так как это все интерфейсы, которые реализует каждый из этих типов. Однако это не помешает, скажем, Int16
использоваться в качестве аргумента типа. Вы определенно не хотите, чтобы это было применимо для IEnumerable<short>
? Что бы пошло не так, если бы его использовали для этого?
Вы могли бы иметь набор неуниверсальных общих перегрузок, которые затем вызывались к ограниченному универсальному приватному методу:
public static decimal FindBestSubsequence(this IEnumerable<decimal> source,
out int startIndex, out int endIndex)
{
return FindBestSubsequenceImpl(source, startIndex, endIndex);
}
public static decimal FindBestSubsequence(this IEnumerable<int> source,
out int startIndex, out int endIndex)
{
return FindBestSubsequenceImpl(source, startIndex, endIndex);
}
// etc
// Could constrain T more if it was useful in the method, but we know
// T will only be one of the types we want, because only this class can
// call this method
private static decimal FindBestSubsequence<T>
(IEnumerable<T> source, out int startIndex, out int endIndex)
where T : struct
{
}